关于后端:Dockerfile中的保留字指令讲解

7次阅读

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

之前简略学过 Docker,过后是为了疾速部署一个我的项目,过的很快,对于 Dockerfile 文件的编写,有些显的生疏。

所以就写了这篇文章。心愿可能帮忙到大家哦!!!

一、Dockerfile 是什么?

概念:

Dockerfile 是用来构建 Docker 镜像的构建文件,由一系列命令和参数形成的脚本

构建三步骤:

  1. 编写 Dockerfile 文件
  2. docker build
  3. docker run

Centos 案例:

centos 案例:

FROM scratch  #真正的根底镜像,ADD centos-7-x86_64-docker.tar.xz /

# label 阐明的意思
LABEL \  
    org.label-schema.schema-version="1.0" \
    org.label-schema.name="CentOS Base Image" \
    org.label-schema.vendor="CentOS" \
    org.label-schema.license="GPLv2" \
    org.label-schema.build-date="20201113" \
    org.opencontainers.image.title="CentOS Base Image" \
    org.opencontainers.image.vendor="CentOS" \
    org.opencontainers.image.licenses="GPL-2.0-only" \
    org.opencontainers.image.created="2020-11-13 00:00:00+00:00"

CMD ["/bin/bash"] #最初一行执行的命令

在哪找到的勒,在 hub.docker.com 上找到滴:centos。

咱们不会,然而能够先去看看人家怎么写的,抄作业这事,我想大家都相熟吧。俗称 CV 大法😂。

二、Dockerfile 构建过程剖析

入门常识:

  1. 每条保留字指令(明天的重点)都必须为 大写字母 并且前面要 追随至多一个参数

    如:

    FROM scratch  #真正的根底镜像,ADD centos-7-x86_64-docker.tar.xz /
  2. 指令依照从上到下,程序执行
  3. #示意正文。

    # 这就是正文
  4. 每条指令都会创立一个新的镜像层,并对镜像进行提交。

    就如上面这样,能够套娃一样。

Dockerfile 执行流程剖析:

  1. docker从根底镜像运行一个容器
  2. 执行一条指令并对容器作出批改
  3. 执行相似 docker commit 的操作提交一个新的镜像层。
  4. docker再基于刚提交的镜像运行一个新容器
  5. 执行 dockerfile 中的下一条指令直到所有指令都执行实现

后文有案例,联合案例回过来看更容易了解。


小小番外

在现阶段,咱们将 DockerfileDocker 镜像和 Docker 容器对待为软件的三个不同阶段。

Dockerfile面向开发 —>Docker 镜像成为交付规范 —>Docker 容器则波及部署与运维

  • Dockerfile 中定义了过程所须要的所有货色,以前须要依赖的环境变量、依赖包、运行时环境等都被写入到 Dockerfile 文件中啦。比起之前你在 Liunx 服务器中,下载那么那么多软件,配置那么那么多,真的是简略蛮多,起码对于我这个菜鸡来说用 Docker 部署真的简略了蛮多的。
  • Docker镜像是在用 Dockerfile 定义了一个文件后,docker build 时产生的一个 Docker 镜像,当运行时 Docker 镜像时,才会真正开始提供服务。
  • Docker 容器就是运行起来即可提供服务的。

三、Dockerfile 保留字指令

Dockerfiel 保留字指令大抵有以下:

  1. FROM
  2. MAINTANINER
  3. RUN
  4. EXPOSE
  5. WORKDIR
  6. ENV
  7. ADD
  8. COPY
  9. VOLUME
  10. CMD
  11. ENTRYPOINT
  12. ONBUILD

3.1、FROM

根底镜像,即以后新镜像是基于哪个镜像创立的。

# 基于 openjdk:8 创立镜像
FROM openjdk:8

3.2、MAINTAINER

镜像维护者的姓名和邮箱地址

MAINTAINER 宁在春 <crush@163.com>

3.3、RUN

容器构建时须要运行的指令

RUN mkdir -p /conf/my.cn

3.4、EXPOSE

以后容器对外裸露的端口

# 暴露出 MyCat 的所需端口
EXPOSE 8066 9066

3.5、WORKDIR

指定在创立容器后,终端默认登录的进来工作目录

# 容器数据卷,用于数据保留和长久化工作
WORKDIR /usr/local/mycat

3.6、ENV

用来在构建镜像过程中设置环境变量

# 用来在构建镜像过程中设置环境变量 ENV MYCAT_HOME=/usr/local/mycat

这个环境变量能够在后续的任何 RUN 指令中应用,这就如同在命令后面指定了环境变量前缀一样; 也能够在其它指令中间接应用这些环境变量。

如:

RUN $MYCAT_HOME/mycat

3.7、ADD 和 COPY

ADD

将宿主机目录下的文件拷贝进镜像,并且 ADD 命令会主动解决 URL 和解压 tar 压缩包

ADD centos-6-docker.tar.xz / 

COPY

相似 ADD, 拷贝文件和目录到镜像中。

将从构建上下文目录中 < 源门路 > 的文件 / 目录复制到新的一层的镜像内的 < 指标门路 > 地位

COPY src destCOPY ["src" "dest"]

3.8、VOLUME

容器数据卷,用于数据长久化和数据保留。

# 将 mycat 的配置文件的地址暴露出映射地址, 启动时间接映射宿主机的文件夹 VOLUME /usr/local/mycat

3.9、CMD 和 ENTRYPOINT

CMD

CMD 的指令和 RUN 类似,也是两种格局:

  • shell格局:CMD< 命令 >
  • exec 格局:CMD [“ 可执行文件“,”参数 1“,”参数 2“…..]

Dockerfile中能够有多个 CMD 指令,但只有最初一个失效,CMD 会被 docker run 之后的参数替换。

ENTRYPOINT

指定一个容器启动时要运行的命令。

ENTRYPOINT 的目标和 CMD 一样,都是在指定容器启动程序及参数。

区别

在这里先简略阐明一下区别,你能够将 CMD 了解为笼罩

CMD cat /conf/my.cnfCMD /bin/bash

这两条指令都写在 Dockerfile 文件中,只会执行 CMD /bin/bash,而不会执行 CMD cat /conf/my.cnf, 因为CMD /bin/bash 把上一条间接笼罩掉了。

ENTRYPOINT 则不同,你能够将 ENTRYPOINT 简略了解为追加。

次要体现在 docker run 上,如果应用dockerfile 文件中最初是 CMD 结尾,则在运行时不可能额定追加命令,否则会笼罩掉 Dockerfile 中的 CMD 命令。

Dockerfile 文件中最初一行为 ENTRYPOINT 结尾时,你能够在 docker run 命令后追加一些命令.

3.10、ONBUILD

当构建一个被继承的 Dockerfile 时运行命令,父镜像在被子继承后,父镜像的 onbuild 被触发。

四、实战案例

4.1、制作一个本人的 Centos 镜像

4.1.1、引入:

咱们先从阿里云上拉取一个 centos 看看,看看有哪些问题,而后咱们再进行自定义。

docker pull centos # 拉取镜像 docker run -it centos #运行镜像# ===== 测试 ====vim ceshi.txtifconfig pwd

为什么会这样? 因为 docker 仓库中的 Centos 是精简版,其只有内核,没有其它的货色。

要求自定义的 Centos 可能解决上述问题。

4.1.2、编写 Dockerfile 文件

为咱们自定义的 Centos 编写 Dockerfile 文件

FROM centosMAINTAINER 宁在春 <crush@163.com>ENV MYPATH /usr/localWORKDIR $MYPATHRUN yum -y install vimRUN yum -y install net-toolsEXPOSE 80 CMD echo $MYPATHCMD echo "success"CMD /bin/bash  #只会运行最初一个

而后把这个复制进去即可。

mkdir -p /usr/local/docker/mycentos # 本人创立寄存的地位 vim Dockerfile

4.1.3、构建 centos 镜像

docker build -f /usr/local/docker/mycentos/Dockerfile  -t mycentos:1.1 .

解释:

  • -f:前面追随的是 Dockerfile 文件
  • -t:前面追随的镜像名和版本号。
  • 最初的小数点:就表明是当前目录。
  • docker build -f Dockerfile 文件 -t 镜像名:tag .
  • 当 dockerfile 文件命名为 dockerfile 时并且在当前目录下时可简写为:
  • docker build  -t 镜像名:tag .docker build   -t mycentos:1.1 .

执行

看到最初的这个就是代表胜利了。

docker images 查看全副镜像:

4.1.4、运行 Centos 镜像

docker run -it mycentos:1.3pwdifconfig

之所以咱们进去容器的目录会从 / 切换到 /usr/local 是因为在 dockerfile 文件中曾经写明。

ENV MYPATH /usr/localWORKDIR $MYPATH

4.1.5、查看镜像的变更历史

docker history mycentos:1.1

在这里也能够看进去,镜像它是由 Dockerfile 文件中的指令,一层一层构建进去的。

4.2、ONBUILD 示例

率先构建一个夫镜像

编写 dockerfile 文件,命名为dockerfile2

FROM centosRUN yum -y install  curlONBUILD RUN echo "我被子镜像继承了,输入此条语句"CMD ["crul", "-s","http://ip.cn"]
docker build -f /usr/local/docker/mycentos/Dockerfile2 -t my_father_centos .

构建一个镜像继承夫镜像

编写 dockerfile 文件,命名为 dockerfile3

FROM my_father_centosRUN yum -y install  curlCMD ["crul", "-s","http://ip.cn"]
docker build -f /usr/local/docker/mycentos/Dockerfile3 -t my_son_centos .

能够看到父镜像中的语句被输入了。

五、喃喃自语

纸上得来终觉浅,绝知此事要躬行。

大家好,我是博主 宁在春:主页

一名喜爱文艺却踏上编程这条路线的小青年。

心愿:咱们,待别日相见时,都已有所成

换个小猫表情,咱们一起击个掌吧。

正文完
 0