Docker第7课:Dockerfile基本指令

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因此可以正常运行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值