Dockerfile - 工作流程、构建镜像、文件语法

打印 上一主题 下一主题

主题 789|帖子 789|积分 2369

目次

一、Dockerfile 
1.1、简介
1.2、Dockerfile 构建镜像的流程
1.3、Dockerfile 文件语法
1.3.1、留意事项
1.3.2、FROM
1.3.3、MAINTAINER(官方已废弃)
1.3.4、RUN
1.3.5、EXPOSE
1.3.6、WORKDIR
1.3.7、ADD 和 COPY
1.3.8、ENV
1.3.9、VOLUME
1.3.10、CMD 和 ENTRYPOINT


一、Dockerfile 


1.1、简介

a)Dockerfile 是什么?
        Dockerfile 就是镜像的形貌文件.
b)Dockerfile 的作用?
        通过 Dockerfile 文件就可以构建一个属于本身的镜像.
c)为什么使用 Dockerfile 构建镜像?
        官方的镜像确实足够好了,适用于大多数应用场景,但是如果我们想要构建属于我们本身的业务镜像,就必要自界说镜像了.
比方,你写了一个 Spring 项目,还用到了,redis,tomcat...... 这些容器,那么你部署项目标时间,还必要先去启动 redis,tomcat ...... 这些容器,而且如果要部署到多台呆板上,整个部署的过程就相称繁琐.  通过 Dockerfile 就可以提前将这些部署操纵写好,我们只必要通过 build 指令构建镜像,末了运行镜像就完成了部署.
d)如何通过 Dockerfile 构建镜像?
        a. 在指定位置创建一个 Dockerfile 文件,进行编写.
        b. 通过以下命令构建镜像.
  1. docker build -t 自定义镜像名:自定义版本 .(指定 Dockerfile 文件所在位置,"." 表示当前目录)
复制代码

1.2、Dockerfile 构建镜像的流程


a)编写 Dockerfile 文件:比方在 /root 目次下创建一个 Dockerfile 文件进行编写,就称 /root(Dockerfile 文件所在目次)为 context(上下文).
b)哀求 DockerServer 构建:因为 Docker 也是一个客户端服务器程序,因此我们可以在客户端通过 build 命令来哀求 DockerServer 进行构建镜像.
c)开始构建:DockerServer 会拿到 context(上下文)中的全部 Dockerfile 开始构建.  具体的,会对  Dockerfile 文件中的每一行指令都构建出一个 暂时镜像,并保存到 cache 中(如许做是为了日后如果有修改 Dockerfile 文件,比如在原来的基础上增长了几条命令,那么之前命令构建好的镜像就直接从缓存里拿了,提升了构建速度),末了就构建出了一个最终的镜像.
   Ps:Dockerfile 编写要求,一行只能存在一条完成的命令
  d)特例1:如果 context 中存在 dockerIgnore 文件,那么本次构建则不会构建 dockerIgnore 文件中形貌的文件.
e)特里2:如果我就想让 DockerServer 每次都把 Dockerfile 中的命令都加载一遍,就可以在 build 命令中加上 --no-cache 参数,如许就不会把每次天生的零时镜像保存到 cache 中.

1.3、Dockerfile 文件语法

1.3.1、留意事项


  • 每条指令都必须大写,背面都至少必要一个参数.
  • 指令按照从上到下,顺序执行.
  • # 表现注释.
  • 每条指令都会创建一个新的镜像层,并对镜像进行提交(暂时镜像).
1.3.2、FROM

a)表现当前镜像是基于哪一个镜像的. 
这个指令是非常有必要的,因为一个容器就是一个操纵体系,我们写的 Dockerfile 总不大概每次都是从操纵体系的层面写起.  比方你的运行的是一个 Java 项目,那么就必要 JDK 情况来支持,总不能本身手写 JDK 吧~
  1. FROM 基于哪个镜像
复制代码
  Ps:第一个指令必须是 FROM
  b)比方,我们要构建一个镜像,是基于 centos 镜像的,那么就必要创建一个 Dockerfile 文件,编写内容如下
  1. FROM centos:7
复制代码
通过如下指令通过当前目次下的 Dockerfile 文件构建名为 mycentos 镜像
  1. [root@VM-8-17-centos dockerfile]# docker build -t mycentos:1 .
  2. [+] Building 0.1s (5/5) FINISHED                                                                                                                            docker:default
  3. => [internal] load build definition from Dockerfile                                                                                                                  0.0s
  4. => => transferring dockerfile: 56B                                                                                                                                   0.0s
  5. => [internal] load .dockerignore                                                                                                                                     0.0s
  6. => => transferring context: 2B                                                                                                                                       0.0s
  7. => [internal] load metadata for docker.io/library/centos:7                                                                                                      0.0s
  8. => [1/1] FROM docker.io/library/centos:latest                                                                                                                        0.0s
  9. => exporting to image                                                                                                                                                0.0s
  10. => => exporting layers                                                                                                                                               0.0s
  11. => => writing image sha256:22773018c04267669821153cd42ef21101902b10a8a16f340fbef85a77821d03                                                                          0.0s
  12. => => naming to docker.io/library/mycentos:1                                                                                                                         0.0s
复制代码
如许,我们本身的镜像就构建好了
  1. [root@VM-8-17-centos dockerfile]# docker images
  2. REPOSITORY                  TAG              IMAGE ID       CREATED       SIZE
  3. centos                      latest           5d0da3dc9764   2 years ago   231MB
  4. mycentos                    1                22773018c042   2 years ago   231MB
复制代码

1.3.3、MAINTAINER(官方已废弃)

镜像维护者的姓名和邮箱地址.
   Ps:官方已废弃,这里就不讲了
  
1.3.4、RUN

a)构建镜像时必要运行的指令.
  1. RUN 要运行的指令
复制代码
b)比方要基于 centos 构建镜像,同时盼望下载好 vim 编辑器,RUN 指令的写法就有以下两种方式
  1. # 第一种写法
  2. RUN yum install -y vim
  3. # 第二种写法
  4. RUN ["yum", "install", "-y", "vim"]
复制代码
这里使用第一种方式来演示,那么 Dockerfile 文件如下
  1. FROM centos:7
  2. RUN yum install -y vim
复制代码
构建镜像
  1. [root@VM-8-17-centos dockerfile]# docker build -t mycentos:1 .
  2. [+] Building 35.6s (6/6) FINISHED                                                                                                                           docker:default
  3. => [internal] load .dockerignore                                                                                                                                     0.0s
  4. => => transferring context: 2B                                                                                                                                       0.0s
  5. => [internal] load build definition from Dockerfile                                                                                                                  0.0s
  6. => => transferring dockerfile: 74B                                                                                                                                   0.0s
  7. => [internal] load metadata for docker.io/library/centos:7                                                                                                           0.0s
  8. => CACHED [1/2] FROM docker.io/library/centos:7                                                                                                                      0.0s
  9. => [2/2] RUN yum install -y vim                                                                                                                                     33.7s
  10. => exporting to image                                                                                                                                                1.9s
  11. => => exporting layers                                                                                                                                               1.8s
  12. => => writing image sha256:e30f98790cacacea34fce01e42b64b14dd5e489645e4df6f1b4f9e3ac31c12b6                                                                          0.0s
  13. => => naming to docker.io/library/mycentos:1                                                                                                                         0.0s
复制代码
运行容器,查抄 vim 是否安装乐成
  1. [root@VM-8-17-centos dockerfile]# docker run -it mycentos:1
  2. [root@795b36479fe7 /]# ll
  3. total 64
  4. -rw-r--r--   1 root root 12114 Nov 13  2020 anaconda-post.log
  5. lrwxrwxrwx   1 root root     7 Nov 13  2020 bin -> usr/bin
  6. drwxr-xr-x   5 root root   360 Dec 28 02:57 dev
  7. drwxr-xr-x   1 root root  4096 Dec 28 02:57 etc
  8. drwxr-xr-x   2 root root  4096 Apr 11  2018 home
  9. lrwxrwxrwx   1 root root     7 Nov 13  2020 lib -> usr/lib
  10. lrwxrwxrwx   1 root root     9 Nov 13  2020 lib64 -> usr/lib64
  11. drwxr-xr-x   2 root root  4096 Apr 11  2018 media
  12. drwxr-xr-x   2 root root  4096 Apr 11  2018 mnt
  13. drwxr-xr-x   2 root root  4096 Apr 11  2018 opt
  14. dr-xr-xr-x 115 root root     0 Dec 28 02:57 proc
  15. dr-xr-x---   2 root root  4096 Nov 13  2020 root
  16. drwxr-xr-x   1 root root  4096 Dec 28 02:56 run
  17. lrwxrwxrwx   1 root root     8 Nov 13  2020 sbin -> usr/sbin
  18. drwxr-xr-x   2 root root  4096 Apr 11  2018 srv
  19. dr-xr-xr-x  13 root root     0 Dec 28 02:57 sys
  20. drwxrwxrwt   1 root root  4096 Dec 28 02:56 tmp
  21. drwxr-xr-x   1 root root  4096 Nov 13  2020 usr
  22. drwxr-xr-x   1 root root  4096 Nov 13  2020 var
  23. [root@795b36479fe7 /]# vim test   
  24. [root@795b36479fe7 /]# cat test
  25. hellow world
复制代码
  Ps:-it 参数表现运行容器后立即与容器进行交互,如果不加此参数,运行 centos 容器启动后会立即竣事(centos 镜像中没有必要执行的任务)
  
1.3.5、EXPOSE

a)声明当前容器对外暴露的端口号.  此命令的作用只是声明,日后方便别人看的,因为端口号暴露是可以在 docker run 启动容器时通过 -p 参数指定的.
  1. EXPOSE 端口号
复制代码
b)比方,声明该容器暴露的端口号为 8080、15672、5672,那么 Dockerfile 文件编写如下
  1. FROM centos:7
  2. RUN yum install -y vim# 这里只是声明容器中使用的端口号EXPOSE 8080EXPOSE 15672EXPOSE 5672
复制代码

1.3.6、WORKDIR

a)指定在创建容器后,终端默认进来的工作目次(一个落脚点).  如果 WORKDIR 指定的目次不存在,就会自动创建目次结构并进入.
  1. # 绝对路径
  2. WORKDIR /apps/data
  3. # 相对路径
  4. WORKDIR a
  5. # 注意:WORKDIR 指令可以在 Dockerfile 文件中多次使用.  以上连续使用就表示,
  6. # 先进入 /apps/data 目录,然后在进入 /apps/data/a 目录
复制代码
b)比方,先辈入 /apps/data 目次,在进入 /apps/data/a 目次,那么 Dockerfile 文件如下
  1. FROM centos:7
  2. RUN yum install -y vim# 这里只是声明容器中使用的端口号EXPOSE 8080EXPOSE 15672EXPOSE 5672WORKDIR /apps/dataWORKDIR a
复制代码
构建好后进入镜像,查抄当前所在目次
  1. [root@VM-8-17-centos dockerfile]# docker build -t mycentos3 .
  2. [+] Building 0.3s (8/8) FINISHED                                                                                                                            docker:default
  3. => [internal] load build definition from Dockerfile                                                                                                                  0.0s
  4. => => transferring dockerfile: 191B                                                                                                                                  0.0s
  5. => [internal] load .dockerignore                                                                                                                                     0.0s
  6. => => transferring context: 2B                                                                                                                                       0.0s
  7. => [internal] load metadata for docker.io/library/centos:7                                                                                                           0.0s
  8. => [1/4] FROM docker.io/library/centos:7                                                                                                                             0.0s
  9. => CACHED [2/4] RUN yum install -y vim                                                                                                                               0.0s
  10. => [3/4] WORKDIR /apps/data                                                                                                                                          0.1s
  11. => [4/4] WORKDIR a                                                                                                                                                   0.1s
  12. => exporting to image                                                                                                                                                0.1s
  13. => => exporting layers                                                                                                                                               0.1s
  14. => => writing image sha256:5661a00d5fe4468bb0f231d44e5c16e609d65f3e37ac8c24697c8a6e8220eab9                                                                          0.0s
  15. => => naming to docker.io/library/mycentos3                                                                                                                          0.0s
  16. [root@VM-8-17-centos dockerfile]#
  17. [root@VM-8-17-centos dockerfile]# docker run -it mycentos3
  18. [root@89c6748a1083 a]# pwd
  19. /apps/data/a
  20. [root@89c6748a1083 a]#
复制代码

1.3.7、ADD 和 COPY

a)将宿主机目次下的文件拷贝到镜像.
  1. ADD 宿主机目录或URL 容器内目录
  2. COPY 构建上下文中的文件 容器内目录
复制代码
b)ADD 和 COPY的区别:
相同点:

  • ADD 和 COPY 都是用来拷贝宿主机上的文件到镜像中.
不同点:

  • ADD 如果拷贝的是一个 tar 包,会自动解压.
  • COPY 只能拷贝上下文中的文件到工作目次,ADD 可以将宿主机上恣意目次下的文件拷贝到镜像.
  • ADD 不但可以拷贝宿主机文件,还可以通过指定 URL 来下载必要的文件.
c)比方,将当前目次下的 aa.txt 文件拷贝到容器的工作目次,Dockerfile 文件如下
  1. FROM centos:7
  2. RUN yum install -y vim# 这里只是声明容器中使用的端口号EXPOSE 8080EXPOSE 15672EXPOSE 5672WORKDIR /apps/dataWORKDIR aADD aa.txt .
复制代码
构建镜像后进入容器,查抄文件
  1. [root@VM-8-17-centos dockerfile]# docker build -t mycentos:1 .
  2. [+] Building 0.2s (10/10) FINISHED                                                                                                                          docker:default
  3. => [internal] load build definition from Dockerfile                                                                                                                  0.0s
  4. => => transferring dockerfile: 204B                                                                                                                                  0.0s
  5. => [internal] load .dockerignore                                                                                                                                     0.0s
  6. => => transferring context: 2B                                                                                                                                       0.0s
  7. => [internal] load metadata for docker.io/library/centos:7                                                                                                           0.0s
  8. => [1/5] FROM docker.io/library/centos:7                                                                                                                             0.0s
  9. => [internal] load build context                                                                                                                                     0.0s
  10. => => transferring context: 45B                                                                                                                                      0.0s
  11. => CACHED [2/5] RUN yum install -y vim                                                                                                                               0.0s
  12. => CACHED [3/5] WORKDIR /apps/data                                                                                                                                   0.0s
  13. => CACHED [4/5] WORKDIR a                                                                                                                                            0.0s
  14. => [5/5] ADD aa.txt .                                                                                                                                                0.1s
  15. => exporting to image                                                                                                                                                0.0s
  16. => => exporting layers                                                                                                                                               0.0s
  17. => => writing image sha256:66e032475f19cd2dec85f8007cc5329b68eae84b876d5b0b180d588059d86c45                                                                          0.0s
  18. => => naming to docker.io/library/mycentos:1                                                                                                                         0.0s
  19. [root@VM-8-17-centos dockerfile]#
  20. [root@VM-8-17-centos dockerfile]# docker run -it mycentos:1
  21. [root@cac57774ec9d a]# ls
  22. aa.txt
  23. [root@cac57774ec9d a]# cat aa.txt
  24. hello world
  25. [root@cac57774ec9d a]# pwd
  26. /apps/data/a
复制代码

1.3.8、ENV

a)用来在构建镜像过程中设置情况变量.
  1. # 创建环境变量如下
  2. ENV 自定义变量名=值
  3. # 使用:通过 $自定义变量名 即可使用
复制代码

b)比方,自界说变量名为 BASE_PATH,值为 /apps/data ,用来给 WORKDIR 进行配置.
  1. FROM centos:7
  2. RUN yum install -y vim# 这里只是声明容器中使用的端口号EXPOSE 8080EXPOSE 15672EXPOSE 5672# 配置情况变量ENV BASE_PATH=/apps/dataWORKDIR $BASE_PATHADD aa.txt .
复制代码
构建后进入容器,查抄当前目次
  1. [root@VM-8-17-centos dockerfile]# docker build -t mycentos:2 .
  2. [+] Building 0.2s (9/9) FINISHED                                                                                                                            docker:default
  3. => [internal] load .dockerignore                                                                                                                                     0.0s
  4. => => transferring context: 2B                                                                                                                                       0.0s
  5. => [internal] load build definition from Dockerfile                                                                                                                  0.0s
  6. => => transferring dockerfile: 239B                                                                                                                                  0.0s
  7. => [internal] load metadata for docker.io/library/centos:7                                                                                                           0.0s
  8. => [1/4] FROM docker.io/library/centos:7                                                                                                                             0.0s
  9. => [internal] load build context                                                                                                                                     0.0s
  10. => => transferring context: 27B                                                                                                                                      0.0s
  11. => CACHED [2/4] RUN yum install -y vim                                                                                                                               0.0s
  12. => CACHED [3/4] WORKDIR /apps/data                                                                                                                                   0.0s
  13. => [4/4] ADD aa.txt .                                                                                                                                                0.0s
  14. => exporting to image                                                                                                                                                0.0s
  15. => => exporting layers                                                                                                                                               0.0s
  16. => => writing image sha256:1ef398b6982b0ce29fb20c7aa1383150694791b3d898c1b6d19c12fdea994517                                                                          0.0s
  17. => => naming to docker.io/library/mycentos:2                                                                                                                         0.0s
  18. [root@VM-8-17-centos dockerfile]# docker run -it mycentos:2
  19. [root@500be777bf0a data]# pwd
  20. /apps/data
复制代码

1.3.9、VOLUME

a)容器数据卷,用来声明容器中的某个目次可以挂载到宿主机中.  这个命令和 EXPOSE 一样也仅仅只是声明,因为将来通过 docker run 启动容器时可以通过 -v 参数指定数据卷挂载.
  1. VOLUME 目录
复制代码
b)比方,声明容器中的 /apps/data 目次可以挂载到宿主机中,如下
  1. VOLUME /apps/data
复制代码

1.3.10、CMD 和 ENTRYPOINT

a)CMD & ENTRYPOINT 的作用
都是用来指定容器启动时默认执行的指令.
   Ps:CMD 指令可以存在多个,但是存在多个只有末了一个收效.
  b)使用语法
  1. CMD 命令
  2. ENTRYPOINT 命令
复制代码
比方命令是 java -jar demo.jar ,这里实际上有两种方式誊写:


  • 直接命令方式:java -jar demo.jar
  • 字符串数组方式(推荐):["java", "-jar", "demo.jar"]
推荐缘故原由:通过字符串数组的方式,在未来启动容器的时间,如果必要调解,可以覆盖数组中的参数(怎么覆盖,下文会讲)
c)区别
覆盖参数的方式不一样,比方启动 centos 命令原本要初始化的命令为 ls /apps/data,现在要覆盖成 ls /
1. cmd 配置后,启动容器时进行覆盖如下:
  1. # 语法
  2. docker run 镜像:版本号 覆盖自己定义的命令
  3. # 当前场景的写法
  4. docker run centos:7 ls /
复制代码
2. entrypoint 配置后,启动容器时进行覆盖如下:
  1. # 语法
  2. docker run --entrypoint=覆盖指令 镜像:版本号 传递参数
  3. # 当前场景写法
  4. docker run --entrypoint=ls centos:7 /
复制代码
  Ps:使用的前提必须是字符串数组的方式 
  
d)如何使用
从上述区别中也可以看出,entrypoint 的覆盖方式比力麻烦,因此一个较为普遍的使用方式:


  • entrypoint 用来誊写一个容器固定的指令.
  • cmd 用来给 entrypoint 转达参数.
比方,必要初始化的命令为 ls /apps/data ,那么 Dockerfile 文件如下
  1. FROM centos:7
  2. RUN yum install -y vim# 这里只是声明容器中使用的端口号EXPOSE 8080EXPOSE 15672EXPOSE 5672# 命令 ls ,参数 /apps/dataENTRYPOINT ["ls"]CMD ["/apps/data"]
复制代码
构建镜像并启动容器
  1. [root@VM-8-17-centos dockerfile]# docker build -t mycentos:2 .
  2. [+] Building 0.1s (9/9) FINISHED                                                                                                                            docker:default
  3. => [internal] load build definition from Dockerfile                                                                                                                  0.0s
  4. => => transferring dockerfile: 263B                                                                                                                                  0.0s
  5. => [internal] load .dockerignore                                                                                                                                     0.0s
  6. => => transferring context: 2B                                                                                                                                       0.0s
  7. => [internal] load metadata for docker.io/library/centos:7                                                                                                           0.0s
  8. => [1/4] FROM docker.io/library/centos:7                                                                                                                             0.0s
  9. => [internal] load build context                                                                                                                                     0.0s
  10. => => transferring context: 27B                                                                                                                                      0.0s
  11. => CACHED [2/4] RUN yum install -y vim                                                                                                                               0.0s
  12. => CACHED [3/4] WORKDIR /apps/data                                                                                                                                   0.0s
  13. => CACHED [4/4] ADD aa.txt .                                                                                                                                         0.0s
  14. => exporting to image                                                                                                                                                0.0s
  15. => => exporting layers                                                                                                                                               0.0s
  16. => => writing image sha256:148a9754a1fd4bff7e6c15a70db21cf594a7811378420057996207dc1ec0ffd1                                                                          0.0s
  17. => => naming to docker.io/library/mycentos:2                                                                                                                         0.0s
  18. [root@VM-8-17-centos dockerfile]#
  19. [root@VM-8-17-centos dockerfile]#
  20. [root@VM-8-17-centos dockerfile]# docker run mycentos:2
  21. aa.txt
  22. [root@VM-8-17-centos dockerfile]#
  23. [root@VM-8-17-centos dockerfile]# docker run mycentos:2 /
  24. anaconda-post.log
  25. apps
  26. bin
  27. dev
  28. etc
  29. home
  30. lib
  31. lib64
  32. media
  33. mnt
  34. opt
  35. proc
  36. root
  37. run
  38. sbin
  39. srv
  40. sys
  41. tmp
  42. usr
  43. var
复制代码
如许将来一旦要修改初始化参数,就可以直接在启动容器时进行修改.



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

拉不拉稀肚拉稀

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表