Docker 基础 ( 十三 ) DockerFile

DockerFile 介绍

dockerfile 是用来构建docker镜像的文件,是命令参数脚本

  • 构建步骤:
    1. 编写dockerfile 文件
    2. docker build 构建成为一个镜像
    3. docker run 运行镜像
    4. docker push 发送镜像(DockerHub、阿里云镜像)
  • 查看官方镜像文件的构建



DockerFile 构建过程

  • 基础知识:
    1. 每个保留关键字(指令)都必须是大写字母
    2. 指令从上到下顺序执行
    3. #表示注释
    4. 每一个指令都会创建提交一个新的镜像层,并提交!
  • dockerfile 是面向开发的,要发布项目、做镜像需要编写dockerfile文件。
  • DockerFile:构建文件,定义了一切的步骤,源代码
  • DockerImages:通过DockerFile构建生成的镜像,最终发布和运行产品。
  • Docker容器:容器就是镜像运行起来提供服务。

DockerFile的指令

  1. FROM               # 基础镜像,一切从这里开始构建
  2. MAINTAINER         # 镜像作者:姓名+邮箱
  3. RUN                # 镜像构建的时候需要运行的命令
  4. ADD                # 步骤。(tomcat镜像的压缩包就是一种添加内容)
  5. WORKDIR            # 镜像的工作目录
  6. VOLUME             # 挂载的目录
  7. EXPOSE             # 暴露端口配置
  8. CMD                # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代 (替换)
  9. ENTRYPOINT         # 指定这个容器启动的时候要运行的命令,可以直接追加命令 (追加)
  10. ONBUILD           # 当构建一个被继承 DockerFile ,这个时候就会运行 ONBUILD 的指令,是一种触发指令
  11. COPY              # 类似ADD命令,将我们的文件拷贝到镜像中
  12. ENV               # 构建的时候设置环境变量

CMD 和 ENTRYPOINT 的区别:

  1. CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代 (替换)
  2. ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以直接追加命令(追加)

实战测试:

  • centos7 镜像构建
    FROM scratch
    ADD centos-7-x86_64-docker.tar.xz /
    LABEL \
        org.label-schema.schema-version="1.0" \
        org.label-schema.name="CentOS Base Image" \
        org.label-schema.vendor="CentOS" \
        org.label-schema.license="GPLv2" \
        org.label-schema.build-date="20200504" \
        org.opencontainers.image.title="CentOS Base Image" \
        org.opencontainers.image.vendor="CentOS" \
        org.opencontainers.image.licenses="GPL-2.0-only" \
        org.opencontainers.image.created="2020-05-04 00:00:00+01:00"
    CMD ["/bin/bash"]
  • Docker Hub 中 99%的镜像都是从这个基础镜像过来的 FROM scratch,然后配置需要的软件和配置来进行构建。
  • FROM scratch
    官方说明:该镜像是一个空的镜像,可以用于构建busybox等超小镜像,可以说是真正的从零开始构建属于自己的镜像。要知道,一个官方的ubuntu镜像有60MB+,CentOS镜像有70MB+
    可以把一个可执行文件扔进来直接执行
  • 注意:scratch不可以被pull
  • FROM scratch专门用于构建最小镜像,直接pull会报以下错误,scratch是一个保留名称
[root@VM-0-6-centos ~]# docker pull scratch
Using default tag: latest
Error response from daemon: 'scratch' is a reserved name
  • 如何制作大小为 0 的镜像
    既然scratch不能被拉取,如何做到docker image ls看到一个0字节的镜像
    官方给出了下面方法:
    tar cv --files-from /dev/null | docker import - scratch
[root@VM-0-6-centos /]# tar cv --files-from /dev/null | docker import - scratch
sha256:ca0b4798edfafb22179f11d84493611112df0cdfbd1bd7c592c67f30a14a3e6f
[root@VM-0-6-centos /]# docker images
REPOSITORY            TAG       IMAGE ID       CREATED         SIZE
scratch               latest    ca0b4798edfa   8 seconds ago   0B
创建一个自己的 centos
  • 新建dockerfile-centos文件
[root@VM-0-6-centos ceshi]# vi dockerfile-centos
  • 编写dockerfile文件
FROM centos    # 基础镜像是官方原生的centos
MAINTAINER yj<yj@qq.com>    # 作者
ENV MYPATH /usr/local    # 配置环境变量的目录
WORKDIR $MYPATH     # 将工作目录设置为 MYPATH
RUN yum -y install vim    # 给官方原生的centos 增加 vim指令
RUN yum -y install net-tools    # 给官方原生的centos 增加 ifconfig命令
EXPOSE 80    # 暴露端口号为80
CMD echo $MYPATH    # 输出下 MYPATH 路径
CMD echo "-----end-----"    
CMD /bin/bash    # 启动后进入 /bin/bash
  • 构建镜像文件
    docker build -f dockerfile-centos -t mycentos:1.0 .
    注意带上版本号,否则每次都回去找最新版 latest
[root@VM-0-6-centos ceshi]# docker build -f dockerfile-centos -t mycentos:1.0 .
Sending build context to Docker daemon  4.096kB
Step 1/10 : FROM centos
 ---> 300e315adb2f
Step 2/10 : MAINTAINER yj<yj@qq.com>
 ---> Running in 6026cec2776c
Removing intermediate container 6026cec2776c
 ---> 60feb235dd11
Step 3/10 : ENV MYPATH /usr/local
 ---> Running in 9e7149e0dc2c
Removing intermediate container 9e7149e0dc2c
 ---> c08d48a4db30
Step 4/10 : WORKDIR $MYPATH
 ---> Running in a11c3f9f23d5
Removing intermediate container a11c3f9f23d5
 ---> 1180ba69b198
Step 5/10 : RUN yum -y install vim
 ---> Running in 8973448d3648

Step 10/10 : CMD /bin/bash
 ---> Running in 104b3b2d2b4f
Removing intermediate container 104b3b2d2b4f
 ---> 201f0cb357f9
Successfully built 201f0cb357f9
Successfully tagged mycentos:1.0
[root@VM-0-6-centos ceshi]# docker images
REPOSITORY            TAG       IMAGE ID       CREATED          SIZE
mycentos              1.0       201f0cb357f9   3 minutes ago    295MB
  • 测试运行
[root@VM-0-6-centos ceshi]# docker run -it mycentos:1.0
[root@a2a3e933ff8e local]# pwd     // 与Dockerfile文件中 WORKDIR 设置的 MYPATH 一致
/usr/local
[root@a2a3e933ff8e local]# vim    // vim 指令可以使用
[root@a2a3e933ff8e local]# ifconfig    // ifconfig 指令可以使用
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.3  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:ac:11:00:03  txqueuelen 0  (Ethernet)
        RX packets 14  bytes 1205 (1.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
  • 查看镜像构建历史步骤
    docker history mycentos:1.0
[root@VM-0-6-centos ceshi]# docker history mycentos:1.0
IMAGE          CREATED          CREATED BY                                      SIZE      COMMENT
201f0cb357f9   11 minutes ago   /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "/bin…   0B        
c47254ec9a24   11 minutes ago   /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "echo…   0B        
197b57ff7221   11 minutes ago   /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "echo…   0B        
c0ec0ff691f8   11 minutes ago   /bin/sh -c #(nop)  EXPOSE 80                    0B        
2b19515fe29c   11 minutes ago   /bin/sh -c yum -y install net-tools             24.9MB    
e770a5ebe23e   11 minutes ago   /bin/sh -c yum -y install vim                   60.7MB    
1180ba69b198   11 minutes ago   /bin/sh -c #(nop) WORKDIR /usr/local            0B        
c08d48a4db30   11 minutes ago   /bin/sh -c #(nop)  ENV MYPATH=/usr/local        0B        
60feb235dd11   11 minutes ago   /bin/sh -c #(nop)  MAINTAINER yj<yj@qq.com>     0B        
300e315adb2f   6 months ago     /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B        
<missing>      6 months ago     /bin/sh -c #(nop)  LABEL org.label-schema.sc…   0B        
<missing>      6 months ago     /bin/sh -c #(nop) ADD file:bd7a2aed6ede423b7…   209MB

我们平时拿到一个镜像,可以用 docker history 镜像id 研究一下是怎么构建的

测试CMD:

  • 新建一个dockerfile文件
[root@VM-0-6-centos ceshi]# vim dockerfile-test-cmd
FROM centos
CMD [“ls”,”-a”] # 启动后执行 ls -a 命令
  • 构建镜像
    docker build -f dockerfile-test-cmd -t cmd-test:0.1 .
  • 运行镜像
[root@VM-0-6-centos ceshi]# docker run cmd-test:0.1 # 由结果可得,运行后就执行了 ls -a 命令
.
..
.dockerenv
bin
dev
etc
home
  • 追加一个命令 -l 成为ls -al:展示列表详细数据
[root@VM-0-6-centos ceshi]# docker run cmd-test:0.1 -l
docker: Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused “exec: \”-l\”:
executable file not found in $PATH”: unknown.
ERRO[0000] error waiting for container: context canceled
  • cmd的情况下 -l 替换了CMD[“ls”,”-l”]-l不是命令所以报错

测试ENTRYPOINT:

  • 编写dockerfile文件
[root@VM-0-6-centos ceshi]# vim dockerfile-test-entrypoint
FROM centos
ENTRYPOINT [“ls”,”-a”]
  • 构建镜像
    docker build -f dockerfile-test-entrypoint -t cmd-test:0.1 .
  • 运行镜像
[root@VM-0-6-centos ceshi]# docker run entrypoint-test:0.1
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found …
  • -l 命令,是直接拼接在ENTRYPOINT命令后面
[root@VM-0-6-centos ceshi]# docker run entrypoint-test:0.1 -l #注意输出结果
total 56
drwxr-xr-x 1 root root 4096 May 16 06:32 .
drwxr-xr-x 1 root root 4096 May 16 06:32 ..
-rwxr-xr-x 1 root root 0 May 16 06:32 .dockerenv
lrwxrwxrwx 1 root root 7 May 11 2019 bin -> usr/bin
drwxr-xr-x 5 root root 340 May 16 06:32 dev
drwxr-xr-x 1 root root 4096 May 16 06:32 etc
drwxr-xr-x 2 root root 4096 May 11 2019 home
lrwxrwxrwx 1 root root 7 May 11 2019 lib -> usr/lib
lrwxrwxrwx 1 root root 9 May 11 2019 lib64 -> usr/lib64 ….
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容