关于docker:第十二篇Docker-Dockerfile之Spring-Cloud直播商城-b2b2c电子商务技术总结

32次阅读

共计 4163 个字符,预计需要花费 11 分钟才能阅读完成。

Docker Dockerfile
什么是 Dockerfile?
Dockerfile 是一个用来构建镜像的文本文件,文本内容蕴含了一条条构建镜像所需的指令和阐明。

应用 Dockerfile 定制镜像
这里仅解说如何运行 Dockerfile 文件来定制一个镜像,具体 Dockerfile 文件内指令详解,将在下一节中介绍,这里你只有晓得构建的流程即可。

1、上面以定制一个 nginx 镜像(构建好的镜像内会有一个 /usr/share/nginx/html/index.html 文件)

在一个空目录下,新建一个名为 Dockerfile 文件,并在文件内增加以下内容:

FROM nginx
RUN echo '这是一个本地构建的 nginx 镜像' > /usr/share/nginx/html/index.html


2、FROM 和 RUN 指令的作用

FROM:定制的镜像都是基于 FROM 的镜像,这里的 nginx 就是定制须要的根底镜像。后续的操作都是基于 nginx。

RUN:用于执行前面跟着的命令行命令。有以下俩种格局:

shell 格局:

RUN < 命令行命令 ># < 命令行命令 > 等同于,在终端操作的 shell 命令。

exec 格局:

RUN ["可执行文件", "参数 1", "参数 2"]# 例如:# RUN ["./test.php", "dev", "offline"] 等价于 RUN ./test.php dev offline

留神:Dockerfile 的指令每执行一次都会在 docker 上新建一层。所以过多无意义的层,会造成镜像收缩过大。例如:

FROM centos
RUN  yum install  wget
RUN  wget  -O redis.tar.gz  "
RUN  tar  -xvf redis.tar.gz
以上执行会创立  3 层镜像。可简化为以下格局:FROM centos
RUN  yum install  wget \
     &&  wget  -O redis.tar.gz  " \
     &&  tar  -xvf redis.tar.gz

如上,以 && 符号连贯命令,这样执行后,只会创立 1 层镜像。

开始构建镜像
在 Dockerfile 文件的寄存目录下,执行构建动作。

以下示例,通过目录下的 Dockerfile 构建一个 nginx:v3(镜像名称: 镜像标签)。

注:最初的 . 代表本次执行的上下文门路,下一节会介绍。

$ docker build -t nginx:v3 .

以上显示,阐明曾经构建胜利。

上下文门路
上一节中,有提到指令最初一个 . 是上下文门路,那么什么是上下文门路呢?

$ docker build -t nginx:v3 .
上下文门路,是指 docker 在构建镜像,有时候想要应用到本机的文件(比方复制),docker build 命令得悉这个门路后,会将门路下的所有内容打包。

解析:因为 docker 的运行模式是 C/S。咱们本机是 C,docker 引擎是 S。理论的构建过程是在 docker 引擎下实现的,所以这个时候无奈用到咱们本机的文件。这就须要把咱们本机的指定目录下的文件一起打包提供给 docker 引擎应用。

如果未说明最初一个参数,那么默认上下文门路就是 Dockerfile 所在的地位。

留神:上下文门路下不要放无用的文件,因为会一起打包发送给 docker 引擎,如果文件过多会造成过程迟缓。

指令详解
COPY
复制指令,从上下文目录中复制文件或者目录到容器里指定门路。

格局:

COPY [--chown=<user>:<group>] < 源门路 1 >...  < 指标门路 >COPY [--chown=<user>:<group>] ["< 源门路 1 >",...  "< 指标门路 >"]

[–chown=<user>:<group>]:可选参数,用户扭转复制到容器内文件的拥有者和属组。

< 源门路 >:源文件或者源目录,这里能够是通配符表达式,其通配符规定要满足 Go 的 filepath.Match 规定。例如:


`COPY hom* /mydir/COPY hom?.txt /mydir/`

< 指标门路 >:容器内的指定门路,该门路不必当时建好,门路不存在的话,会主动创立。

ADD
ADD 指令和 COPY 的应用格相似(同样需要下,官网举荐应用 COPY)。性能也相似,不同之处如下:

ADD 的长处:在执行 < 源文件 > 为 tar 压缩文件的话,压缩格局为 gzip, bzip2 以及 xz 的状况下,会主动复制并解压到 < 指标门路 >。
ADD 的毛病:在不解压的前提下,无奈复制 tar 压缩文件。会令镜像构建缓存生效,从而可能会令镜像构建变得比拟迟缓。具体是否应用,能够依据是否须要主动解压来决定。
CMD
相似于 RUN 指令,用于运行程序,但二者运行的工夫点不同:

CMD 在 docker run 时运行。
RUN 是在 docker build。
作用:为启动的容器指定默认要运行的程序,程序运行完结,容器也就完结。CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所笼罩。

留神:如果 Dockerfile 中如果存在多个 CMD 指令,仅最初一个失效。

格局:

CMD <shell 命令 > CMD ["< 可执行文件或命令 >","<param1>","<param2>",...] CMD ["<param1>","<param2>",...]  # 该写法是为 ENTRYPOINT 指令指定的程序提供默认参数

举荐应用第二种格局,执行过程比拟明确。第一种格局实际上在运行的过程中也会主动转换成第二种格局运行,并且默认可执行文件是 sh。

ENTRYPOINT
相似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所笼罩,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。

然而, 如果运行 docker run 时应用了 –entrypoint 选项,将笼罩 CMD 指令指定的程序。

长处:在执行 docker run 的时候能够指定 ENTRYPOINT 运行所需的参数。

留神:如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最初一个失效。

格局:

ENTRYPOINT ["<executeable>","<param1>","<param2>",...]

能够搭配 CMD 命令应用:个别是变参才会应用 CMD,这里的 CMD 等于是在给 ENTRYPOINT 传参,以下示例会提到。

示例:

假如已通过 Dockerfile 构建了 nginx:test 镜像:

FROM nginx
ENTRYPOINT ["nginx", "-c"] # 定参 CMD ["/etc/nginx/nginx.conf"] # 变参

1、不传参运行

$ docker run  nginx:test

容器内会默认运行以下命令,启动主过程。

nginx -c /etc/nginx/nginx.conf

2、传参运行

$ docker run  nginx:test -c /etc/nginx/new.conf

容器内会默认运行以下命令,启动主过程(/etc/nginx/new.conf: 假如容器内已有此文件)

nginx -c /etc/nginx/new.conf

ENV
设置环境变量,定义了环境变量,那么在后续的指令中,就能够应用这个环境变量。

格局:

ENV <key> <value>ENV <key1>=<value1> <key2>=<value2>…
以下示例设置 NODE_VERSION = 7.2.0,在后续的指令中能够通过 $NODE_VERSION 援用:

ENV NODE_VERSION 7.2.0RUN curl -SLO "\  && curl -SLO"

ARG
构建参数,与 ENV 作用统一。不过作用域不一样。ARG 设置的环境变量仅对 Dockerfile 内无效,也就是说只有 docker build 的过程中无效,构建好的镜像内不存在此环境变量。

构建命令 docker build 中能够用 –build-arg < 参数名 >=< 值 > 来笼罩。

格局:

ARG < 参数名 >[=< 默认值 >]

VOLUME
定义匿名数据卷。在启动容器时遗记挂载数据卷,会主动挂载到匿名卷。

作用:

防止重要的数据,因容器重启而失落,这是十分致命的。
防止容器一直变大。
格局:

VOLUME ["< 门路 1 >", "< 门路 2 >"...]VOLUME < 门路 >

在启动容器 docker run 的时候,咱们能够通过 -v 参数批改挂载点。

EXPOSE
仅仅只是申明端口。

作用:

帮忙镜像使用者了解这个镜像服务的守护端口,以不便配置映射。
在运行时应用随机端口映射时,也就是 docker run -P 时,会主动随机映射 EXPOSE 的端口。
格局:

EXPOSE < 端口 1 > [< 端口 2 >...]

WORKDIR
指定工作目录。用 WORKDIR 指定的工作目录,会在构建镜像的每一层中都存在。(WORKDIR 指定的工作目录,必须是提前创立好的)。

docker build 构建镜像过程中的,每一个 RUN 命令都是新建的一层。只有通过 WORKDIR 创立的目录才会始终存在。

格局:

WORKDIR < 工作目录门路 >

USER
用于指定执行后续命令的用户和用户组,这边只是切换后续命令执行的用户(用户和用户组必须提前曾经存在)。

格局:

USER < 用户名 >[:< 用户组 >]
HEALTHCHECK
用于指定某个程序或者指令来监控 docker 容器服务的运行状态。

格局:

HEALTHCHECK [选项] CMD < 命令 >:设置查看容器健康状况的命令 HEALTHCHECK NONE:如果根底镜像有健康检查指令,应用这行能够屏蔽掉其健康检查指令 HEALTHCHECK [选项] CMD < 命令 > : 这边 CMD 前面追随的命令应用,能够参考 CMD 的用法。

ONBUILD
用于提早构建命令的执行。简略的说,就是 Dockerfile 里用 ONBUILD 指定的命令,在本次构建镜像的过程中不会执行(假如镜像为 test-build)。当有新的 Dockerfile 应用了之前构建的镜像 FROM test-build,这时执行新镜像的 Dockerfile 构建时候,会执行 test-build 的 Dockerfile 里的 ONBUILD 指定的命令。

格局:

ONBUILD < 其它指令 >

LABEL
LABEL 指令用来给镜像增加一些元数据(metadata),以键值对的模式,语法格局如下:

LABEL <key>=<value> <key>=<value> <key>=<value> ...

比方咱们能够增加镜像的作者:

LABEL org.opencontainers.image.authors="xxx"

正文完
 0