Dockerfile实战

​先前我们在讲述docker的镜像构建时对Dockerfile做了初步介绍,本文将结合上次的内容做更加细致的介绍,从回顾到实战演练讲述Dockerfile,本文先通过三个简单的案例感受、理解Dockerfile,主要是写httpd、sshd、以及systemctl的Dockerfile,之后会进行对其他服务如Nginx、Tomcat以及MySQL编写并且测试Dockerfile。

回顾Dockerfile

​ 说到Dockerfile,就离不开Dockerfile的核心组件,尤其是镜像。镜像是运行容器的基础环境,也就是说镜像是docker容器创建的关键,而创建镜像的三种方式之一的Dockerfile是最为灵活的。

什么是Dockerfile?

​ Dockerfile可以看做是被Docker程序所解释翻译的脚本,由一组命令集合而成,每一条命令都对应一条操作命令,有其翻译为Linux下的具体命令。用户可以通过自定义内容来快速构建镜像。

​ 其实说简单点,你可以认为Dockerfile是“专门用于构建镜像的shell脚本”。

​ 还记得Dockerfile的严格格式吗?我们先来看一下这个表格。

Dockerfile与Dockerfile实战

​ Dockerfile是一种分层结构,其中的指令每一条都会构建一层镜像及容器,只不过这是临时的,除了基础镜像,其他中间产生的容器最后都会被清除。当然有时候会出现一些“无名氏”镜像,标志就是使用docker images命令时ID和tag都是none。

​ 出现none镜像的原因有两类:一则是好的none镜像;二则是坏的none镜像。好的none镜像:代表的是中间镜像,你可以认为是父镜像的子镜像,可以使用docker images -a查看。这类镜像不会占用磁盘空间,但是占用了屏幕显示空间。坏的none镜像:这类可能会导致磁盘空间问题。一般这种情况是旧镜像更新产生。

​ 因此,一般情况我们都可以通过命令将none镜像删除(实战中会给出)。

Dockerfile的作用是什么?

​ Dockerfile的核心作用就是用户可以灵活、快速、支持自定义构建所需镜像。

简述docker执行Dockerfile流程以及构建使用镜像过程 docker执行Dockerfile流程

(1)docker从基础镜像运行一个容器;
(2)执行一条指令并对容器作出修改;
(3)执行类似docker commit的操作提交一个新的镜像层;
(4)docker再基于刚提交的镜像运行一个新容器;
(5)执行dockerfile中的下一条指令直到所有指令都执行完成。

构建使用镜像过程

构建镜像命令举例:docker build -t image_name . (不要忽视这个点)

使用镜像命令举例:docker run -d -P image_name

最后使用docker ps -a 查看容器运行状态,如果是up状态就可以镜像测试验证了。

Dockerfile实战 1、构建httpd服务镜像

首先创建工作目录

mkdir apache cd apache

编写Dockerfile

vim Dockerfile

#基于的基础镜像 FROM CentOS #维护镜像的用户信息 MAINTAINER lokott@lokott.org #镜像操作指令安装Apache软件 RUN yum -y update RUN yum -y install httpd #开启 80端口 EXPOSE 80 #复制网站首页文件 ADD index.html /var/www/html/index.html #将执行脚本复制到镜像中 ADD run.sh /run.sh RUN chmod 755 /run.sh #启动容器是执行脚本 CMD ["/run.sh"]

其中注意:run 命令可以有多条CMD只能有一条,若有多条则只会执行最后一条

编写启动httpd服务的shell脚本

vim run.sh

#!/bin/bash rm -rf /run/httpd/* exec /usr/sbin/apachectl -D FOREGROUND

编写测试页面

vim index.html

<h1>this is docker httpd web</h1>

使用tree命令查看目录的文件结构

[root@localhost apache]# tree ./ ./ ├── Dockerfile ├── index.html └── run.sh 0 directories, 3 files

构建和使用镜像(创建运行容器)

[root@localhost apache]# docker build -t httpd:new . #因为我之前已经构建过,所以很快,此处案例显示过程是为了体现Dockerfile执行时的特征:分层和中间容器及镜像 Sending build context to Docker daemon 4.096kB Step 1/9 : FROM centos:7 ---> 5e35e350aded Step 2/9 : MAINTAINER lokott@123.com ---> Using cache ---> 3a68b2812314 Step 3/9 : RUN yum -y update ---> Using cache ---> ecf1ecb0a774 Step 4/9 : RUN yum install -y httpd ---> Using cache ---> ae8c1ee32fbd Step 5/9 : EXPOSE 80 ---> Using cache ---> 29f12f1f7490 Step 6/9 : ADD index.html /var/www/html/index.html ---> Using cache ---> f56113e6b984 Step 7/9 : ADD run.sh /run.sh ---> Using cache ---> 886bf9e654ab Step 8/9 : RUN chmod +x /run.sh ---> Using cache ---> bf53e19ad44f Step 9/9 : CMD ["/run.sh"] ---> Using cache ---> 9500f0aefd1d Successfully built 9500f0aefd1d Successfully tagged httpd:new [root@localhost apache]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE httpd new 9500f0aefd1d 35 seconds ago 524MB centos 7 5e35e350aded 5 months ago 203MB ...//之后的案例将不再查看镜像了哈! #基于构建的镜像创建并运行容器,给容器取名为test [root@localhost apache]# docker run --name test -d -P httpd:new b7ec122849c61e36adb4a8891a87126afb53b1d5edfa2fda2a1ea18afa1a3169 [root@localhost apache]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b7ec122849c6 httpd:new "/run.sh" 3 seconds ago Up 3 seconds 0.0.0.0:32768->80/tcp test

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/6d914bd5a00ba4e4557c0bfa7b14597d.html