Docker| 进阶吧,DockerFile

Posted 大数据指北

tags:

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

文章目录


在之前的文章中,了解到了Docker的基本知识以及最为炫酷的Docker-compose。我想你不会仅仅满足于此,学习知识的过程犹如吸毒,越学越带劲。

接下来我们以最为通俗的话去理解DockerFile。实现容器化技术的更近一步深入。

一、什么是DcokerFile

dockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本。可以理解为是用来创建镜像的脚本文件。

因此:我们可以知道,一个新容器的构建有以下步骤:

  • 1、编写DockerFile文件
  • 2、docker build 构建镜像
  • 3、docker run

二、DockerFile的基本结构

Dockerfile 一般分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。

首先来定制一个简单nginx镜像

(构建好的镜像内会有一个 /usr/share/nginx/html/index.html 文件)

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

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

这样,我们的Dockerflile文件就编写完成了,接着就通过 Dockerfile 构建一个 nginx:v3(镜像名称:镜像标签):

docker build -t nginx:v3 .

这样一个简单的nginx镜像就创建完成。

三、DockerFile的构建指令

上节,简单的说明了构建镜像的过程,其实在Dockerfile的编写的根据自己的需要,进行各种自定义操作。

dockerfile的指令:

  FROM:指定基础镜像(FROM是必备的指令,并且必须为第一条指令)。

  RUN: 用来执行命令行命令。其基本格式:

      shell格式: RUN  <命令>  ,输入在bash环境中的命令即可,一个dockerfile允许使用RUN不得超过127层,所以,使用一次RUN, 使用 ‘ \\ ’ 换行,使用‘ && ’执行下一条命令。一般使用此种格式;

      exec格式: RUN  <"可执行文件", "参数1", "参数2">,此种方式像是函数调用中的格式;

  COPY:  复制文件。 其基本格式:

      格式1:COPY <源路径>...<目标路径>

      格式2:COPY [“<源路径1>”,....."<目标路径>"]

  ADD: 更高级的复制文件,在COPY的基础上增加了一些功能,如果复制的是压缩包的话,会直接解压,而不需要在使用RUN解压;

  CMD:容器启动命令。其基本格式:

      shell格式: CMD <命令>

      exec格式: CMD ["可执行文件", "参数1", "参数2"...]

      参数列表格式: CMD [“参数1”, “参数2”...],在指定了ENTRYPOINT指令后,用CMD指定具体的参数

  ENTRYPOINT: 入口点。其基本格式分为exec和shell,

      ENTRYPOINT的目的和CMD一样,都是在指定容器启动程序及参数。当指定了ENTRYPOINT后,CMD的含义就发生了改变,不在是直接运行其命令,而是将CMD的内容作为参数传递给ENTRYPOINT指令。其执行时就变成了:  <ENTRYPOINT> "<CMD>"

  ENV: 设置环境变量。(都可以使用这里使用的变量)其基本格式:

      格式1:ENV <key> <value>

      格式2:ENV <key1>=<value1> <key2>=<value>...

  ARG: 构建参数。构建参数和ENV的效果一样,都是设置环境变量,所不同的是ARG所构建的环境变量在将来容器运行时是不存在的。其基本格式:

      格式1: ARG <参数名> [=<默认值>]

      格式2: 该默认值可以在构建命令 docker build  中用 --build-arg <参数名>=<值> 来覆盖

  VOLUME: 定义匿名卷。 其基本格式:

      格式1: VOLUME ["<路径1>", "<路径2>"...]

      格式2: VOLUME <路径>

  EXPOSE:  暴露端口。EXPOSE指令是声明运行时容器所提供的端口,在启动容器时不会在因为这个声明而开启端口。 其基本格式:

      格式1: EXPOSE <端口1> [<端口2>...]

  WORKDIR: 指定工作目录。其基本格式:

      格式1: WORKDIR <工作目录路径>

  USER: 指定当前用户。USER是帮助你切换到指定用户。 其基本格式:

      格式1: USER <用户名>

  HEALTCHECK: 健康检查,判断容器的状态是否正常。 其基本格式:

      格式1: HEALTCHECK [选项] CMD <命令> :设置检查容器健康状况的命令

      格式2: HEALTCHECK NONE: 如果基础镜像有健康检查指令,使用此格式可以屏蔽掉其健康检

Dockerflie的命令是很多的,不过用熟悉了就非常nice了。

简要版命令

FROM基础镜像,当前新镜像是基于哪个镜像的
MAINTAINER镜像维护者的姓名混合邮箱地址
RUN容器构建时需要运行的命令
EXPOSE当前容器对外保留出的端口
WORKDIR指定在创建容器后,终端默认登录的进来工作目录,一个落脚点
ENV用来在构建镜像过程中设置环境变量
ADD将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包
COPY类似ADD,拷贝文件和目录到镜像中
VOLUME容器数据卷,用于数据保存和持久化工作
CMD指定一个容器启动时要运行的命令,dockerFile中可以有多个CMD指令,但只有最后一个生效!
ENTRYPOINT指定一个容器启动时要运行的命令!和CMD一样
ARG构建时指定的一些参数
HEALTHCHECH健康检查
USER为RUN、CMD、和 ENTRYPOINT 执行命令指定运行用户

总结的构建流程如下:

四、实战

通过Dockerfile来部署datax容器

首先,datax运行需要python2.x和jdk1.8。

上传jdk1.8 tar包已经datax安装包到本地服务器

在当前目录下编辑Dockerfile文件

  • 1、编写Dockerfile
FROM centos/python-27-centos7
//安装jdk
ADD jdk-8u221-linux-x64.tar.gz /opt/local
ENV JAVA_HOME /opt/local/jdk1.8.0_221
ENV PATH $JAVA_HOME/bin:$PATH
// 添加并解压datax文件到/opt/local 目录
ADD datax.tar.gz /opt/local/
// 设置运行的工作目录,可不添加,运行中使用 docker -w 指定
WORKDIR /opt/local/datax
ENTRYPOINT ["bash"]
  • 2、构建
格式命令:在当前目录下-> docker build -t="镜像名称:TAG" .
. 表示当前目录。

docker build -t="datax_python2" .

这个命令必须在Dockerfile文件所在的目录下运行:

查看本地的镜像,可以看到刚刚创建到的镜像:

  • 3、运行

通过该镜像创建容器:

docker run -it --name dataxpython2 datax_python2

以上是关于Docker| 进阶吧,DockerFile的主要内容,如果未能解决你的问题,请参考以下文章

详解Docker——你需要知道的Docker进阶知识五

详解Docker——你需要知道的Docker进阶知识二

进阶吧神将隐私政策

云计算Docker云平台—Docker进阶

Docker入门与进阶

Docker入门与进阶