Dockerfile
dockerfile 构建步骤:
- 编写docker file文件
- docker build构建镜像
- docker run运行镜像
- docker push发布镜像
基础知识
- 每个保留关键字(指令)都是必须大写字母
- 按照从上到下的顺序执行
- #表示注释
- 每个指令都会创建并提交一个新的镜像层
Dockerfile的指令
FROM #基础镜像,将从这里开始构建景象
MAINTAINER #镜像发布者信息,姓名+邮箱
RUN #构建镜像时需要运行的指令
ADD #添加对应的压缩包
WORKDIR #镜像的工作目录
VOLUME #镜像挂载目录
EXPOSE #暴露端口配置
CMD #指定容器启动时需要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT #指定容器启动时需要运行的命令,可以追加指令
ONBUILD #当构建一个被继承的Dockerfile的时候会运行ONBUILD的指令,即触发指令
COPY #类似于ADD,可以将文件拷贝到镜像中
ENV #构建的时候设置的环境变量
实战测试
DockerHub中绝大多数的镜像都是将scratch
作为基础镜像,配置需要多软件和配件构建属于自己的镜像。
#编写Dockerfile
FROM centos
MAINTAINER Jerry<2457623600@qq.com>
ENV MYPYTH /usr/local
WORKDIR $MYPYTH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPYTH
CMD echo "----end----"
CMD /bin/bash
#构建镜像
docker build -f mycentos -t mycentos:0.1 .
#检查构建景象的结果
Successfully built 6c97e7884cd1
Successfully tagged mycentos:0.1
#查看构建的镜像是否具有对应的命令
[root@378c28dbdb98 local]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.2 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:ac:11:00:02 txqueuelen 0 (Ethernet)
RX packets 25 bytes 2191 (2.1 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen 1000 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
[root@378c28dbdb98 local]# pwd
/usr/local
可以通过docker history
命令查看景象的构建过程
[root@iZ2zefj6kkvtlhfjyf4d09Z /]# docker history 6c97e7884cd1
IMAGE CREATED CREATED BY SIZE COMMENT
6c97e7884cd1 16 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "/bin… 0B
2ddee56d4095 16 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
fca5f4c7c5ce 16 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
81b8dfe017c7 16 minutes ago /bin/sh -c #(nop) EXPOSE 80 0B
797d550658c4 16 minutes ago /bin/sh -c yum -y install net-tools 22.8MB
7464c19381ca 16 minutes ago /bin/sh -c yum -y install vim 57.2MB
af70b3704c8d 16 minutes ago /bin/sh -c #(nop) WORKDIR /usr/local 0B
876222962fab 21 minutes ago /bin/sh -c #(nop) ENV MYPYTH=/usr/local 0B
52b63da0cc46 21 minutes ago /bin/sh -c #(nop) MAINTAINER Jerry<24576236… 0B
0d120b6ccaa8 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:538afc0c5c964ce0d… 215MB
对比CMD和ENTRYPOINT的区别
CMD构建镜像
#编写Dockerfile文件
FROM centos
CMD ["ls","-a"]
#构建镜像
docker build -f mycentos01 -t cmdtest .
#运行镜像
docker run cc4d57851ff1
#将指令改为docker run cc4d57851ff1 -l之后,将会出现报错
[root@iZ2zefj6kkvtlhfjyf4d09Z docker-test-volume]# docker run cc4d57851ff1 -l
docker: Error response from daemon: OCI runtime create failed: container_linux.go:345: starting container process caused "exec: \"-l\": executable file not found in $PATH": unknown.
ENTRYPOINT构建镜像
#编写Dockerfile文件
FROM centos
ENTRYPOINT ["ls","-a"]
#构建镜像
ocker build -f mycentos02 -t entrypointtest .
#运行镜像
docker run bb7afd869255
#将指令改为docker run bb7afd869255 -l之后,可以正常运行
[root@iZ2zefj6kkvtlhfjyf4d09Z docker-test-volume]# docker run bb7afd869255 -l
total 0
drwxr-xr-x 1 root root 6 Sep 25 11:12 .
drwxr-xr-x 1 root root 6 Sep 25 11:12 ..
-rwxr-xr-x 1 root root 0 Sep 25 11:12 .dockerenv
lrwxrwxrwx 1 root root 7 May 11 2019 bin -> usr/bin
结论:在CMD构建的镜像后面加-l
后,由于CMD指令不可追加指令,所以-l
会代替镜像中的ls -a
且-l
并非完整指令,因此会产生报错。而ENTRYPOINT构建镜像可以追加指令,因此可以构成完整的指令ls -al
因此可以正常运行。