乐趣区

Docker学习之Dockerfile-构建镜像3

我们可以了解到,镜像的定制实际上就是定制每一层所添加的配置、文件。如果我们可以把每一层修改、安装、构建、操作的命令都写入一个脚本,用这个脚本来构建、定制镜像,那么之前提及的无法重复的问题、镜像构建透明性的问题、体积的问题就都会解决。这个脚本就 Dockerfile。

认识 Dockerfile

Dockerfile 是一个文本文件,其内包含了一条条的 指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。接下来以 nginx 为列通过 Dockerfile 文件来制定镜像。

在一个空白目录中,建立一个文本文件,并命名为 Dockerfile:

$ mkdir mynginx
$ cd mynginx
$ touch Dockerfile

Dockerfile 内容如下:

这个 Dockerfile 很简单,一共就两行。涉及到了两条指令,FROM 和 RUN。接下来就先了解这两个指令。

Dockerfile 指令之 FROM

FROM 指令的目的就是来指定基础镜像

所谓定制镜像,那一定是以一个镜像为基础,在其上进行定制 。而 FROM 就是指定基础镜像,因此一个 Dockerfile 中 FROM 是必备的指令,并且 必须是第一条指令

在 Docker Hub 上有非常多的高质量的官方镜像,有可以直接拿来使用的服务类的镜像,如 nginx、redis、mongo、mysql、httpd、php、tomcat 等;也有一些方便开发、构建、运行各种语言应用的镜像,如 node、openjdk、python、ruby、golang 等。可以在其中寻找一个最符合我们最终目标的镜像为基础镜像进行定制。

Dockerfile 指令之 RUN

RUN 指令是用来执行命令行命令的。由于命令行的强大能力,RUN 指令在定制镜像时是最常用的指令之一。其格式有两种:

  • shell 格式:RUN < 命令 >,就像直接在命令行中输入的命令一样。刚才写的 Dockerfile 中的 RUN 指令就是这种格式。
    RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html

  • exec 格式:RUN [“ 可执行文件 ”, “ 参数 1 ”, “ 参数 2 ”],这更像是函数调用中的格式。

前面的文章有说过,Dockerfile 中每一个指令都会建立一层,RUN 也不例外。每一个 RUN 的行为,就和刚才我们手工建立镜像的过程一样:新建立一层,在其上执行这些命令,执行结束后,commit 这一层的修改,构成新的镜像。

构建镜像

这里我们使用了 docker build 命令进行镜像构建。其格式为:

docker build [选项] < 上下文路径 /URL/->

在这里我们指定了最终镜像的名称 -t nginx:v2,构建成功后,就可以运行这个镜像了。

在 Dockerfile 所在目录执行如下图命令来进行镜像的构建:

从命令的输出结果中,我们可以清晰的看到镜像的构建过程。在 Step 2/2 中,如同我们之前所说的那样,RUN 指令启动了一个容器 7c6c2f17c3fc,执行了所要求的命令,并最后提交了这一层 c3d8143457af,随后删除了所用到的这个容器 7c6c2f17c3fc。

可以看到,我们刚才构建的 ngnix:v2 镜像就已存在了,那么就可以以这个镜像为基础启动一个容器

这里再次简单说下运行一个容器的命令:

mynginx-test 容器名称。-d 设置容器在在后台一直运行。-p 端口进行映射,将本地 80 端口映射到容器内部的 80 端口。

最后我们在浏览器输入 localhost 就可以在网页中看到通过 Dockerfile 文件构建镜像的文本了。

这里看到了内容出现编码导致乱码的问题,这是因为多数 docker 基础镜像使用 locale 查看编码,发现默认编码都是 POSIX,这会导致中文乱码。解决方法如下:

首先使用 locale - a 查看容器所有语言环境

其次,dockerfile 中加入以下参数重新生成镜像

ENV LANG=en_US.UTF-8
ENV TZ=Asia/Shanghai
如果有 en_US.utf8 优先使用

退出移动版