目录
Dockerfile是什么
dockerfile的的工作逻辑
Dockerfile、Docker镜像、Docker容器
Dockerfile 常用指令
FROM (构建指令)
MAINTAINER (构建指令)
COPY (构建指令)
ADD (构建指令)
ENV (构建指令)
EXPOSE (设置指令)
VOLUME (设置指令)
WORKDIR (设置指令)
RUN (构建指令)
CMD (设置指令)
ENTRYPOINT (设置指令)
USER
HEALTHCHECK
ARG 构建参数
LABEL
dockerfile仅仅是用来制作镜像的源码文件,是构建容器过程中的指令,docker能够读取dockerfile的指定进行自动构建容器,基于dockerfile制作镜像,每一个指令都会创建一个镜像层,即镜像都是多层叠加而成,
Dockerfile的指令根据作用可以分为两种:构建指令和设置指令。
(1)构建指令用于构建image,其指定的操作不会运行在image的容器中执行。
(2)设置指令用于设置image的属性,其指定的操作将在运行image的容器中执行。
首先需要有一个制作镜像的目录,该目录下有个文件,名称必须为Dockerfile,Dockerfile有指定的格式,#号开头为注释,,指定默认用大写字母来表示,以区分指令和参数,docker build读取Dockerfile是按顺序依次Dockerfile里的配置,且第一条非注释指令必须是FROM 开头,表示基于哪个基础镜像来构建新镜像。可以根据已存在的任意镜像来制作新镜像。
从应用软件的角度来看,Dockerfile、Docker镜像与Docker容器分别代表软件的三个不同阶段:
指定 base 镜像,必须指定且需要在Dockerfile其他指令的前面。后续的指令都依赖于该指令指定的镜像。FROM指令指定的base镜像可以是官方远程仓库中的,也可以位于本地仓库。
该指令有两种格式:
FROM
指定基础image为该image的最后修改的版本(latest)。
或者:
FROM
: 指定基础image为该image的一个tag版本。
格式:MAINTAINER
设置镜像的作者,可以是任意字符串。用于将image的制作者相关的信息写入到image中。当我们对该image执行
docker inspect命令时,输出中有相应的字段记录该信息。
现在已经被“LABEL maintainer=”取代
LABEL maintainer="berry
"
将文件从 build context 复制到镜像。
COPY 支持两种形式:
COPY src ... dest
COPY ["src", ... "dest"]
与 COPY 类似,从 build context 复制文件到镜像。不同的是,如果 src 是归档文件(tar, zip, tgz, xz 等),文件会被自动解压到 dest。
此指令用于复制新文件、目录或者远程URL地址添加到容器的指定
路径下,指令包含两种形式: ADD
... ADD ["
",... " "]
设置环境变量,环境变量可被后面的指令使用,并在容器运行时保持。
格式:ENV
例如:
...
ENV PATH /usr/local/nginx/sbin:$PATH
ENV MY_VERSION 1.3
RUN apt-get install -y mypackage=$MY_VERSION
...
格式:EXPOSE
[ / ...] 可以指定TCP或UDP,默认是TCP
告诉Docker服务器暴露的端口号,供互联系统使用。
在启动容器的时候如果使用-P,Docker主机自动分配一个端口和容器端口映射。
在启动容器的时候如果使用-p,则可以具体指定哪个宿主机端口和容器端口映射。
当你需要访问容器的时候,可以不是用容器的IP地址而是使用宿主机器的IP地址和映射后的端口。我们会在容器网络部分详细讨论。
格式:VOLUME ["
"] 将文件或目录声明为 volume。使容器中的一个目录具有持久化存储数据的功能,该目录可以被容器本身使用,也可以共享给其他容器使用。我们知道容器使用的是AUFS,这种文件系统不能持久化数据,当容器关闭后,所有的更改都会丢失。当容器中的应用有持久化数据的需求时可以在Dockerfile中使用该指令。我们会在容器存储部分详细讨论。
格式:WORKDIR /path/to/workdir
示例:
WORKDIR /a (这时工作目录为/a)
WORKDIR b (这时工作目录为/a/b)
WORKDIR c (这时工作目录为/a/b/c)
为后面的 RUN, CMD, ENTRYPOINT, ADD 或 COPY 指令设置镜像中的当前工作目录。
在构建镜像过程中要指定执行的命令。
容器启动时运行指定的命令。
Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效。
设置容器启动时运行的命令。
Dockerfile 中可以有多个 ENTRYPOINT 指令,但只有最后一个生效。
USER指令用于指定容器执行程序的用户身份,默认是root用户。
使用USER指定用户时,可以使用用户名、UID或GID,或是两者的组合。当服务不需要管理员权限时,可以通过该命令指定运行用户。
格式:
USER user
USER user:group
USER uid
USER uid:gid
USER user:gid
USER uid:group
示例:
USER www
容器健康状况检查命令
语法有两种:
1. HEALTHCHECK [OPTIONS] CMD command
2. HEALTHCHECK NONE
第一个的功能是在容器内部运行一个命令来检查容器的健康状况
第二个的功能是在基础镜像中取消健康检查命令
[OPTIONS]的选项支持以下三种选项:
--interval=DURATION 两次检查默认的时间间隔为30秒,间隔(s秒、m分钟、h小时),从容器运行起来开始计时interval秒(或者分钟小时)进行第一次健康检查,随后每间隔interval秒进行一次健康检查;还有一种特例请看timeout解析。
--timeout=DURATION 健康检查命令运行超时时长,默认30秒,执行command需要时间,比如curl 一个地址,如果超过timeout秒则认为超时是错误的状态,此时每次健康检查的时间是timeout+interval秒。
--retries=N 当连续失败指定次数后,则容器被认为是不健康的,状态为unhealthy,默认次数是3
格式: ARG <参数名>[=<默认值>]
ARG构建参数和 ENV 的效果一样,都是设置变量。所不同的是, ARG 所设置的构建环境的变量,在将来容器运行时是不会存在这些变量的。但是不要因此就使用 ARG 保存密码之类的信息,因为 docker history 还是可以看到所有值的。
ARG是唯一一个可用于FROM前的指令
ARG CODE_VERSION=latest
FROM busybox:${CODE_VERSION}
给镜像添加信息。使用docker inspect可查看镜像的相关信息
语法:
LABEL
= = = ... 一个Dockerfile种可以有多个LABEL,如下:
LABEL "com.example.vendor"="ACME Incorporated"
LABEL com.example.label-with-value="foo"
LABEL version="1.0"
LABEL description="This text illustrates \
that label-values can span multiple lines."
但是并不建议这样写,最好就写成一行,如太长需要换行的话则使用\符号
如下:
LABEL multi.label1="value1" \
multi.label2="value2" \
other="value3"
说明:LABEL会继承基础镜像中的LABEL,如遇到key相同,则值覆盖