Hello World

Dockerfile 简介

【参考文章】: Dockerfile 菜鸟教程
【参考文章】: 你必须知道的Dockerfile
【参考文章】: Dockerfile: ENTRYPOINT和CMD的区别
【参考文章】: Dockerfile 中的COPY 和 ADD 命令

1. 简介

  Dockerfile 是一个用来构建镜像的文本文件,里面包含了构建镜像的所有的指令;
  在执行 docker build 命令时,就会按照 Dockerfile 中定义的指令顺序执行指令;

2. 基本构成

  1. 基础镜像:制作镜像一般都是在某个镜像的基础上进行操作;
  2. 构建命令:这部分就是 Dockerfile 的主要内容,包含了构建镜像的命令过程;
  3. 启动命令:这部分是容器启动时需要执行的命令,一般容器启动成功后要执行自己服务的启动脚本,让服务运行起来;

3. 基本命令

docker的每一个原语都将创建一个镜像层

3.1 FROM

  设置基础镜像信息,后面都是基于基础镜像进行操作
  FROM centos:7      设置centos7为基础镜像

3.2 MAINTAINER

  设置维护者的信息,一般设置名字和邮箱地址
  MAINTAINER  virgosnail  virgosnail@qq.com  

3.3 WORKDIR

  相当于Linux的 cd 命令
  WORKDIR  /home      进入 home 目录

3.4 USER

  设置执行命令的用户
  USER root      以 root 用户执行命令

3.5 RUN

  执行后面跟着的命令
  RUN  rm  -rf ./*      删除当前目录下的所有文件

3.6 COPY

  将指定的文件、文件夹拷贝到镜像中;
  拷贝目录时只拷贝目录下的内容,不会拷贝该目录;
  文件名信息支持 go 风格的通配符;

  COPY  a.txt   /home 

3.7 ADD

  将指定的文件、文件夹拷贝到镜像中;
  拷贝目录时只拷贝目录下的内容,不会拷贝该目录;
  如果是压缩文件,则自动解压;
  支持从 URL 地址拷贝文件到镜像文件,不推荐,此时会创建更多的镜像层;

  ADD a.txt  /home      将宿主机的 a.txt 文件拷贝到镜像文件的 /home 目录下

3.8 VOLUME

  设置数据卷,挂载主机目录

3.9 EXPOSE

  容器运行的服务端口信息,多个端口则用空格隔开;
  当用 docker run 启动时,
  如果用 p (小写)设置端口映射时,此时 EXPOSE 命令不生效;
  当使用 P (大写)时,则使用随机端口映射到 EXPOSE 的端口;
  
  EXPOSE 21010  21011

3.10 CMD

  设置容器启动后要执行的命令,一般为服务的启动脚本;
  存在多个 CMD 命令时,只有最后一个会生效;
  如果使用 docker  run 命令启动容器时指定了容器启动后执行的命令,则会覆盖 dockerfile 中的 CMD 命令;

  CMD 有两种写法:
  shell:CMD  command  param1  param2
  exec:CMD  ["command","param1","param2"]  推荐使用

3.11 ENTRYPOINT

  如果没有 ENTRYPOINT,docker默认会生成一个 ENTRYPOINT: /bin/sh -c
  存在多个 ENTRYPOINT 命令时,只有最后一个会生效;
  docker容器进程启动的必须参数格式就是 [ENTRYPOINT CMD]
  使用 docker  run 命令启动容器时可以通过 --entrypoint  command  覆盖 dockerfile 中的 ENTRYPOINT 命令;
  ENTRYPOINT 有两种写法:
  shell:ENTRYPOINT  command  param1  param2
  exec:ENTRYPOINT  ["command","param1","param2"] 推荐使用

3.11 ENTRYPOINT 和 CMD 组合使用

  当同时存在 ENTRYPOINT 和 CMD 时,docker 会将 CMD 的参数拼接到 ENTRYPOINT 后面再执行命令;
  ENTRYPOINT 为默认的运行命令,CMD 为默认的运行是参数;

3.11 SHELL 和 EXEC

  当使用shell表示法时, 命令行程序作为sh程序的子程序运行, docker用/bin/sh -c的语法调用. 如果我们用docker ps命令查看运行的docker, 就可以看出实际运行的是/bin/sh -c命令;
  PID为1的进程并不是在Dockerfile里面定义的命令, 而是/bin/sh命令. 如果从外部发送任何POSIX信号到docker容器, 由于/bin/sh命令不会转发消息给实际运行的命令, 则不能安全得关闭docker容器;
  EXEC 则没有这种弊端;

4. 示例

FROM centos:7
MAINTAINER  virgosnail  virgosnail@qq.com
ADD start.sh /home/bin
RUN chmod +x /home/bin/start.sh
CMD /home/bin/start.sh
 使用当前目录下的Dockerfile 构建镜像
 docker build -t image_name:tag .
posted @ 2020-06-20 15:16  小小忧愁米粒大  阅读(285)  评论(0编辑  收藏  举报
瞅啥瞅,好好看书