1100 字
6 分钟
Dockerfile体系结构
Dockerfile体系结构
保留字指令
FROM:基础镜像,当前新镜像是基于哪个镜像的
MAINTANER:镜像维护者的姓名和邮箱地址
RUN:容器构建需要运行的命令
EXPOSE:当前容器对外暴露的端口
EXPOSE 指令是声明运行时容器提供服务端口,这只是一个声明,在运行时并不会因为这个声明应用就会开启这个端口的服务。
在 Dockerfile 中写入这样的声明有两个好处,一个是帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射;
另一个用处则是在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。
要将 EXPOSE 和在运行时使用 -p <宿主端口>:<容器端口> 区分开来。
-p,是映射宿主端口和容器端口,换句话说,就是将容器的对应端口服务公开给外界访问,而 EXPOSE 仅仅是声明容器打算使用什么端口而已,并不会自动在宿主进行端口映射。
WORKDIR:指定在创建容器后,终端默认登录的进来工作目录,一个落脚点
ENV:用来构建镜像过程中设置环境变量
ADD:将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包
COPY:类似ADD,拷贝文件和目录到镜像中,将从构建上下文目录中<源路径>的文件/目录复制到新的一层镜像内的<目标路径>位置COPY src destCOPY ["src", "dest"]
VOLUME:容器数据卷,用于数据保存和持久化工作
CMD:指定一个容器启动时要运行的命令,Dockerfile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run之后的参数替换
CMD ["curl", "-s", "http://ip.cn"]CMD -i
ENTRYPOINT:指定一个容器启动时要运行的命令,和CMD一样都是在指定容器启动程序以及参数指定会追加 不会被覆盖
ENTRYPOINT ["curl", "-s", "http://ip.cn"]
ONBUILD: 当构建一个被继承的Dockerfile时运行命令,父镜像在被子继承后父镜像的onbuild被触发dockerfile运行机制

例子
base镜像(scratch): Docker Hub中99%的镜像都是通过在base镜像中安装和配置需要的软件构建起来的
自定义镜像(mycentos)[root@laptop mydocker]# cat dockerfile
FROM centosMAINTAINER majian<majian@qq.com>ENV mypath /tmpWORKDIR $mypathRUN yum -y install vimRUN yum -y install net-toolsEXPOSE 80CMD /bin/bash[root@laptop mydocker]# docker build -f dockerfile -t mycentos:1.3 .
Sending build context to Docker daemon 2.048kBStep 1/8 : FROM centos---> 0f3e07c0138fStep 2/8 : MAINTAINER majian<majian@qq.com>---> Running in 6d4684ead2faRemoving intermediate container 6d4684ead2fa---> e899711fd7b2Step 3/8 : ENV mypath /tmp---> Running in 25e2618ca1c0Removing intermediate container 25e2618ca1c0---> 498e81a2ddc6Step 4/8 : WORKDIR $mypath---> Running in 51c12df8bf5dRemoving intermediate container 51c12df8bf5d---> 051be51956d5Step 5/8 : RUN yum -y install vim---> Running in 40f00feca24d[root@laptop mydocker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZEmycentos 1.3 b9d313b868fc 32 seconds ago 316MBcentos latest 0f3e07c0138f 6 weeks ago 220MB
[root@laptop mydocker]# docker images mycentos
REPOSITORY TAG IMAGE ID CREATED SIZEmycentos 1.3 b9d313b868fc About a minute ago 316MB
[root@laptop mydocker]# docker run -it mycentos:1.3
[root@9eb191b85d6e tmp]# pwd/tmp[root@9eb191b85d6e tmp]# which vim/usr/bin/vim[root@9eb191b85d6e tmp]# which ifconfig/usr/sbin/ifconfig列出镜像的变更历史:
[root@laptop mydocker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZEmycentos 1.3 b9d313b868fc 3 minutes ago 316MBabc/centos latest 0760a8000e5d 5 hours ago 220MBabc/mytomcat 1.2 f73b412690d6 6 hours ago 507MBtomcat latest 882487b8be1d 3 weeks ago 507MBcentos latest 0f3e07c0138f 6 weeks ago 220MB
[root@laptop mydocker]# docker history b9d313b868fc
IMAGE CREATED CREATED BY SIZE COMMENTb9d313b868fc 3 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "/bin… 0B2c49c2457ddc 3 minutes ago /bin/sh -c #(nop) EXPOSE 80 0B4c1421515876 3 minutes ago /bin/sh -c yum -y install net-tools 29.3MB1e5944f9ebf8 3 minutes ago /bin/sh -c yum -y install vim 66.9MB051be51956d5 4 minutes ago /bin/sh -c #(nop) WORKDIR /tmp 0B498e81a2ddc6 4 minutes ago /bin/sh -c #(nop) ENV mypath=/tmp 0Be899711fd7b2 4 minutes ago /bin/sh -c #(nop) MAINTAINER majian<majian@… 0B0f3e07c0138f 6 weeks ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B<missing> 6 weeks ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B<missing> 6 weeks ago /bin/sh -c #(nop) ADD file:d6fdacc1972df524a… 220MB再看一个例子:
[root@laptop mydocker]# cat dockerfile
FROM centos
ONBUILD RUN echo "father image onbuild"
[root@laptop mydocker]# docker build -f dockerfile -t myip_father .
Sending build context to Docker daemon 2.048kBStep 1/2 : FROM centos---> 0f3e07c0138fStep 2/2 : ONBUILD RUN echo "father image onbuild"---> Running in 9f077f1c3c30Removing intermediate container 9f077f1c3c30---> 145433c7a943Successfully built 145433c7a943Successfully tagged myip_father:latest[root@laptop mydocker]# cat dockerfile2
FROM myip_father
[root@laptop mydocker]# docker build -f dockerfile2 -t myip:son .Sending build context to Docker daemon 3.072kBStep 1/1 : FROM myip_father# Executing 1 build trigger---> Running in d636ed5d3e0cfather image onbuildRemoving intermediate container d636ed5d3e0c---> ec2d399db156Successfully built ec2d399db156Successfully tagged myip:son