天天看点

Docker 镜像构建之 Dockerfile

Docker 镜像构建之 Dockerfile

在 Docker 中构建镜像最常用的方式,就是使用 <code>Dockerfile</code>。Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。官方文档:https://docs.docker.com/engine/reference/builder/

引入部分

二、Dockerfile 的保留字指令详解

1.**FROM**

2.**MAINTAINER**

4.**RUN**

5.**EXPOSE**

6.**WORKDIR**

7.**ENV**

8.**ADD**

9.**COPY**

10.**VOLUME**

11.**CMD** (这个指令需放在最后)

12.ONBUILD

三、构建镜像

关于 . 理解

四、Dockerfile实践

五、镜像构建历史

六、使用构建的镜像创建容器

七、Dockerfile 训练

1.使用 centos7 作为基础镜像部署 nginx 服务

2.在容器中编译安装 nginx 服务

3.构建以 Centos 为依赖镜像并安装 Django 的服务

3.构建以 python 为依赖镜像并安装 Django 服务

4.使用 NGINX 代理 Django

什么是 Dockerfile?

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

通过指令的方式构建镜像

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

构建Dockerfile步骤

编写 Dockerfile 文件

docker built 构建镜像

docker run 创建容器

Dockfile 文件的注意事项

Docker 以从上到下的顺序运行 Dockerfile 的指令。为了指定基本映像,第一条指令必须是 FROM。

每条保留字指令都必须是大写字母, 并且后面要跟随至少一个参数

指令按照从上到下的顺序执行

每条指令可用 # 添加注释

每条指令都会创建一个新镜像层, 并对镜像进行提交

dockerfile的保留字指令

主要保留指令:

<code>FROM</code>

<code>RUN</code>

<code>ADD</code>

<code>COPY</code>

<code>WORKDIR</code>

<code>CMD</code>

一般用以上保留字指令就可以完成容器想要的功能,所有字段如下。

指令

含义

FROM

指定基础镜像,必须为第一个命令

MAINTAINER

维护者信息

RUN

构建镜像docker build时执行的命令

ADD

将本地文件添加到容器中,tar 类型文件会自动解压(网络压缩资源不会被解压)

COPY

功能类似ADD,但是是不会自动解压文件,也不能访问网络资源

CMD

在docker run时会执行的命令,如果存在多个则仅最后一个生效。

LABEL

用于为镜像添加元数据

ENV

设置环境变量

EXPOSE

指定于外界交互的端口

VOLUME

用于指定持久化目录

WORKDIR

工作目录,类似于cd命令

ARG

用于指定传递给构建运行时的变量

ONBUILD

用于设置镜像触发器

基础(依赖)镜像, 就是当前要创建的镜像是基于那个镜像

基本语法如下:

指明镜像维护者及其联系方式(一般是邮箱地址)。官方说明已过时,推荐使用 LABEL。

3.LABEL

语法:<code>LABEL &lt;key&gt;=&lt;value&gt; &lt;key&gt;=&lt;value&gt; &lt;key&gt;=&lt;value&gt; ...</code>

功能是为镜像指定标签或为镜像添加元数据。也可以使用 LABEL 来指定镜像作者。

容器构建时需要运行的命令

暴露容器运行时的监听端口给外部,可以指定端口是监听 TCP 还是 UDP,如果未指定协议,则默认为 TCP。

指定创建容器后, 终端默认处在的工作目录, 也就是落脚点,为 RUN、CMD、ENTRYPOINT 以及 COPY 和 AND 设置工作目录。

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

将宿主机目录下的文件拷贝到镜像里面 (会自动解压 tar 压缩包),src 可以是一个本地文件或者是一个本地压缩文件,压缩文件会自动解压。还可以是一个 url,如果把 src 写成一个 url,那么 ADD 就类似于 wget 命令,然后自动下载和解压。

类似 ADD, 拷贝本地文件到镜像中 (不会自动解压)

用于目录挂载

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

Dockerfile 文件编写好以后,真正构建镜像时需要通过 <code>docker build</code> 命令。

<code>docker build</code> 命令用于使用 <code>Dockerfile</code> 创建镜像。

<code>-f</code>:指定要使用的 Dockerfile 路径;

<code>--tag, -t</code>:镜像的名字及标签,可以在一次构建中为一个镜像设置多个标签。

我们在使用 <code>docker build</code> 命令去构建镜像时,往往会看到命令最后会有一个 <code>.</code> 号。它究竟是什么意思呢?

很多人以为是用来指定 <code>Dockerfile</code> 文件所在的位置的,但其实 <code>-f</code> 参数才是用来指定 <code>Dockerfile</code> 的路径的,那么 <code>.</code> 号究竟是用来做什么的呢?

<code>Docker</code> 在运行时分为 <code>Docker 引擎(服务端守护进程)</code> 和 <code>客户端工具</code>,我们日常使用各种 <code>docker 命令</code>,其实就是在使用 <code>客户端工具</code> 与 <code>Docker 引擎</code> 进行交互。

当我们使用 <code>docker build</code> 命令来构建镜像时,这个构建过程其实是在 <code>Docker 引擎</code> 中完成的,而不是在本机环境。如果在 <code>Dockerfile</code> 中使用了一些 <code>ADD</code> 等指令来操作文件,如何让 <code>Docker 引擎</code> 获取到这些文件呢?

这里就有了一个 <code>镜像构建上下文</code> 的概念,当构建的时候,由用户指定构建镜像时的上下文路径,而 <code>docker build</code> 会将这个路径下所有的文件都打包上传给 <code>Docker 引擎</code>,引擎内将这些内容展开后,就能获取到上下文中的文件了。

举个栗子:我的宿主机 jdk 文件在 /root 目录下,Dockerfile 文件在 /usr/local/dockerfile 目录下,文件内容如下:

那么构建镜像时的命令就该这样写:

再举个栗子:我的宿主机 jdk 文件和 Dockerfile 文件都在 /usr/local/dockerfile 目录下,文件内容如下:

那么构建镜像时的命令则这样写:

接下来我们通过基础镜像 <code>centos:7</code>,在该镜像中安装 jdk 和 tomcat 以后将其制作为一个新的镜像 <code>mycentos:7</code>。

创建目录。

编写 Dockerfile 文件。

Dockerfile 文件内容如下:

构建镜像。

Docker 镜像构建之 Dockerfile
Docker 镜像构建之 Dockerfile

先创建一个 nginx.repo 文件

构建镜像

查看刚刚构建的镜像, 然后实例容器

查看刚刚实例出的容器, 并进入到容器中

检测 nginx 是否部署成功

编辑 Dockerfile 文件

查看是否构建成功,并实例出容器

查看容器是否启动成功, 并测试 nginx

首先构建一个Dockerfile文件

文件 shawn 的构建

查看并使用镜像实例化出容器

查看刚开启的容器,并进入容器启动 Django 服务

使用浏览器验证一下

Docker 镜像构建之 Dockerfile

文件 app 的构建

使用浏览器检验一下

Docker 镜像构建之 Dockerfile

先构建一个 Django 服务, 步骤与上一个例子相同

改变了一下向外暴露的端口

然后来编写 nginx 服务以及代理配置

Docker 镜像构建之 Dockerfile