DockerFile(保你会版本)

Posted zhujingzhi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DockerFile(保你会版本)相关的知识,希望对你有一定的参考价值。

一、什么是dockerfile

  Dockerfile是一个文本格式的配置文件,用户可以使用Dockerfile自定义快速创建属于自己的镜像,Dockerfile是通过很多的参数指令编写的文件,通过docker build 命令来创建镜像

二、基本语法和结构

  Dockerfile由一行行的命令语句组成,并且支持以#号注释

  一般情况,Dockerfile分为四部分:

  1. 基础镜像信息
  2. 维护者信息
  3. 镜像操作指令
  4. 容器启动执行的指令

  其中,一开始必须指定所基于的镜像信息名称,接下来一般是说明的维护者信息,后面则是镜像的操作指令,例如RUN指令,RUN指令将对镜像执行跟随的命令,每运行一条RUN指令,镜像就会添加新的一层,并提交,最后是CMD指令,用来指定运行容器时操作的指令

三、参数指令说明

指令 说明
FROM 指定创建镜像的基础镜像
MAINTAINER 指定维护者信息
RUN 运行命令
CMD 指定启动容器时默认执行的命令
LABEL 指定生成镜像的元数据标签信息
EXPOSE 声明镜像内服务所监听的端口
ENV 指定环境变量
ADD 复制指定的<src>路径下的内容到容器中的<dest>下,<src>可以为URL,如果是tar文件,会自动解压到<dest>路径下
COPY 复制本地主机的<src>路径下的内容到镜像中的<dest>路径下,一般情况下这个常用
ENTRYPOINT 指定镜像的默认入口
VOLUME 创建数据卷挂载点
USER 指定运行容器的用户名或者UID
WORKDIR 配置工作目录
ARG 指定镜像内使用的参数(例如版本号等信息)
ONBUILD 配置当所创建的镜像作为其他镜像的基础镜像时,所执行的创建操作命令
STOPSIGNAL 容器退出的信号值
HEALTHCHECK 如何进行健康检查
SHELL 指定使用shell时默认shell类型

3.1. FROM (小写 from)

指定所创建的镜像的基础镜像,如果不存在,会去DockerHub去下载

格式:
FROM<image>
或者
FROM<image>:<tag>
或者
FROM<image>@<digest>

任何Dockerfile中的第一条指令必须为FROM指令,并且如果在同一个Dockerfile中创建多个镜像,可以使用多个FROM指令(每个镜像各一条)

  

3.2. MAINTAINER (小写 maintainer)

指定维护者信息

格式:
MAINTAINER<name>

该信息会写入到生成镜像的Author属性域中

  例如:

MAINTAINER [email protected]

  

3.3. RUN (小写 run)

运行指令命令

格式:
RUN<command>
或者
RUN ["executable","paraml","param2"]
注意后一个指令会被解析为JSON的数组,因此必须要用双引号

前者默认将在shell终端中运行命令,即/bin/sh -c
后者则是用exec执行,不会启动shell环境

指定使用其他的终端类型可以用第二种方式,例如 RUN ["/bin/sh","-c","echo aaaa"]

每条RUN指令将在当前镜像的基础上执行指定命令,并提交为新的镜像,命令长的时候可以使用  来换行

  例如:

RUN yum update     && yum -y install net-tools openssh openssl     && rm -rf /var/log/a.log

  

3.4. CMD (小写 cmd)

CMD 指令用来指定启动容器时默认执行的命令,有三种格式:
1、CMD ["executable","param1","param2"] 使用exec执行,推荐使用

2、CMD command param1 parma2 在/bin/sh中执行,提供给要交互的应用

3、CMD ["parma1","parma2"] 提供给ENTRYPOINT 的默认参数

每个Dockerfile只有一条CMD命令,如果指定了多条命令,只有最后一条会执行,如果启动容器时手动指定了运行的命令(作为run的参数),会把CMD命令给覆盖

  

3.5. LABEL (小写 label)

LABEL 指令是用来指定生成镜像的元数据标签

格式:
LABEL <key>=<value> <key>=<value> <key>=<value> .......

  例如:

LABEL version="1.0"
LABEL description="Zhu Jingzhi‘s mirror image"

  

3.6. EXPOSE (小写 expose)

EXPOSE 声明镜像内服务监听的端口

格式:
EXPOSE <port> [<port>......]

注意,该指定是声明的作用,不会自动的完成端口的映射
在启动容器的时候需要使用-P 或 -p 来自动分配一个临时端口或者指定具体的端口来做映射

  例如:

EXPOSE 22 443 80

  

3.7. ENV (小写 env)

ENV 指定环境变量,在镜像生成的过程中会被后续的RUN 使用,在镜像启动的容器中也会存在

格式:
ENV<key><value>
或者
ENV<key>=<value>.......

注意在 指令指定的环境变量在运行时可以被覆盖掉
如:
docker run --env <key>=<value> centos

  例如:

ENV PY_VERSION 3.6.1
RUN curl -sSL http://python.org/ftp/python/3.6.1/Python-$PY_VERSION.tar.xz | tar -xJC /usr/src/python
ENV PATH /usr/src/python=$PY_VERSION/bin:$PATH

 

3.8. ADD (小写 add)

该命令将复制指定的<src>路径下的内容到容器中的<dest>路径下

格式:
ADD <src> <dest>

其中<src>可以是Dockerfile所在目录的一个相对路径(文件或者目录),也可以是URL,还可以是个tar文件(如果是tar文件,会自动解压到<dest>路径下),<dest>可以是镜像内的绝对路径,或者相对于工作目录的相对路径

路径支持正则格式
例如:
ADD *.tar /code/

tar压缩包用这个还是很方便的

  

3.9. COPY (小写 copy)

COPY 复制本地主机的<src>(为Dockerfile所在目录的相对路径、文件或者目录)下的内容到镜像中的<dest>目录下,目录不存在会自动创建

格式:
COPY <src> <dest>

路径同样支持正则
当使用本地目录为源目录的时候,非常推荐使用户CMD

  例如:

COPY /opt/data/ /opt/

  

3.10. ENTRYPOINT (小写 entrypoint)

ENTRYPOINT 指定镜像的默认入口,该入口命令会在启动容器时作为根命令执行,所有传入值作为该命令的参数

格式:
ENTRYPOINT ["executable","param1","param2"] 
或者
ENTRYPOINT command param1 param2 

此时,CMD指令指定的值将作为根命令的参数
每个Dockerfile 中只能有一个ENTRYPOINT 当指定多个的时候,只有最后一个生效

在运行时,可以被--entrypoint参数覆盖

  

3.11. VOLUME (小写volume)

VOLUME 创建一个挂载点

格式:
VOLUME ["/data"]

可以从本地主机或者其他容器挂载数据卷,一般用来存放数据库和需要保存的数据

  

3.12. USER (小写 user)

USER 指定运行容器时的用户名或UID ,后续的RUN指令也是使用指定的用户

格式:
USER daemon

当服务不需要管理员权限的时候,可以使用该命令指定运行用户,并且可以在之前创建所需要的用户

要临时获取管理员权限可以是用sudo

  例如:

RUN groupadd -r nginx && useradd -r -g nginx nginx

  

3.13. WORKDIR (小写 workdir)

WORKDIR 为后续的RUN CMD ENTRYPOINT 指令配置工作目录

格式:
WORKDIR /path/to/workdir

可以使用多个WORKDIR指令,后续命令如果参数是相对路径,则会基于之前的命令指定路径

  例如:

WORKDIR /a
WORKDIR b
WORKDIR c

最终的路径是 /a/b/c

  

3.14. ARG (小写 arg)

ARG 指定一些镜像内使用的参数(例如版本信息)

格式:
ARG<name>=[=<default value>]

也可以用docker build --build-arg<name>=<value>来进行指定参数值

  

3.15. ONBUILD (小写 onbuild)

ONBUILD 配置当所创建的镜像作为其他镜像的基础镜像时,所执行的创建操作指令

格式:
ONBUILD [INSTRYCTION]

  例如创建一个镜像A:

[......]
ONBUILD ADD ./app/src
ONBUILD RUN /usr/local/bin/python-build --dir /app/src
[......]

  如果基于镜像A创建新的镜像,新的Dockerfile中使用FROM 镜像A指定基础镜像,会自动执行镜像A中的ONBUILD指令的内容,等价在后面添加了两条指令

FROM 镜像A

# 等价于:
ADD . /app/src
RUN /usr/local/bin/python-build --dir /app/src

  

3.16. STOPSIGNAL (小写 stopsignal)

STOPSIGNAL 指定所创建的镜像启动的容器接收的退出的信号值

例如:
STOPSIGNAL signal

  

3.17. HEALTHCHECK (小写 healthcheck)

HEALTHCHECK 配置所启动容器如何进行健康检查,Docker1.12 才开始支持

两种格式:
1、HEALTHCHECK [OPTIONS] CMD command
# 根据所执行命令的返回值是否为0来判断

OPTIONS支持的参数:
--interval=DURATION(默认30s) :过多久检查一次
--timeout=DURATION(默认30s) : 每次检查的超时时间
--retries=N(默认为:3) : 如果失败了重试的次数

2、HEALTHCHECK NONE
# 禁止基础镜像的中的健康检查

  

3.18. SHELL (小写 shell)

SHELL 指定其他命令使用shell时默认shell类型

格式:
SHELL ["executable","parameters"]

默认值为["/bin/sh","-c"] 

  

四、创建镜像

  创建完dockerfile文件后 可以使用docker build 命令来创建镜像

  基本的格式:

  docker build [选项] Dockerfile路径

  该命令会读取指定路径下(包括子目录)的Dockerfile,并将该路径下的所有的内容发给docker服务端,由服务端来创建镜像,因此建议除非生成镜像需要,否则一般吧Dockerfile放到一个空的目录中

  两点经验:

  1. 如果使用非内容路径下的Dockerfile,可以通过 -f 参数来指定路径
  2. 要指定生成镜像的标签信息,可以使用 -t 参数

  例如:

指定Dockerfile所在的路径为/opt/docker_builder,并且希望生成镜像的标签为build_repo/image

[[email protected] ~]# docker build -t build_repo/image -f /opt/docker_builder

  

五、Dockerfile实战文件

  说了一堆的每个参数的语法格式,下面来做个实战的dockerfile文件,来生成一个镜像,并使用这个镜像创建个容器,并运行起来,我们来使用nginx服务来做实战

5.1. 下载基础镜像

5.2. 编写Dockerfile文件

5.3. 构建镜像并启动容器

5.4. 访问测试

以上是关于DockerFile(保你会版本)的主要内容,如果未能解决你的问题,请参考以下文章

sublime代码片段

这些操作系统的概念,保你没听过!

装饰器设计模式这样学,保你必懂

#VSCode保存插件配置并使用 gist 管理代码片段

我作了首诗,保你闭着眼睛也能写对二分查找

如何管理在每个 git 版本中添加私有代码片段?