在之前的文章中,了解到了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。
在当前目录下编辑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" .
- 3、运行
通过该镜像创建容器:
docker run -it --name dataxpython2 datax_python2