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 <key>=<value> <key>=<value> <key>=<value> ...</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 文件内容如下:
构建镜像。

先创建一个 nginx.repo 文件
构建镜像
查看刚刚构建的镜像, 然后实例容器
查看刚刚实例出的容器, 并进入到容器中
检测 nginx 是否部署成功
编辑 Dockerfile 文件
查看是否构建成功,并实例出容器
查看容器是否启动成功, 并测试 nginx
首先构建一个Dockerfile文件
文件 shawn 的构建
查看并使用镜像实例化出容器
查看刚开启的容器,并进入容器启动 Django 服务
使用浏览器验证一下
文件 app 的构建
使用浏览器检验一下
先构建一个 Django 服务, 步骤与上一个例子相同
改变了一下向外暴露的端口
然后来编写 nginx 服务以及代理配置