资讯专栏INFORMATION COLUMN

Docker学习之Dockerfile 构建镜像(3)

Lavender / 1020人阅读

摘要:我们可以了解到,镜像的定制实际上就是定制每一层所添加的配置文件。指令之指令的目的就是来指定基础镜像。指令之指令是用来执行命令行命令的。由于命令行的强大能力,指令在定制镜像时是最常用的指令之一。构建镜像这里我们使用了命令进行镜像构建。

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

Hello, Docker!

" > /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 优先使用

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/27908.html

相关文章

  • Docker习之基本概念及安装(1)

    摘要:分层存储因为镜像包含操作系统完整的文件系统,其体积往往是庞大的,因此在设计时,就充分利用的技术,将其设计为分层存储的架构。分层存储的特征还使得镜像的复用定制变的更为容易。 什么是Docker Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 L...

    lvzishen 评论0 收藏0
  • Docker习之Compose介绍(6)

    摘要:列出项目中目前的所有容器。删除所有停止状态的服务容器。一般的,当指定数目多于该服务当前实际运行容器,将新创建并启动容器反之,将停止容器。命令说明恢复处于暂停状态中的服务。 Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排。其代码目前在 https://github.com/docker/com... 上开源。 介绍 Compose 定位...

    luodongseu 评论0 收藏0
  • Docker习之Compose介绍(6)

    摘要:列出项目中目前的所有容器。删除所有停止状态的服务容器。一般的,当指定数目多于该服务当前实际运行容器,将新创建并启动容器反之,将停止容器。命令说明恢复处于暂停状态中的服务。 Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排。其代码目前在 https://github.com/docker/com... 上开源。 介绍 Compose 定位...

    Jensen 评论0 收藏0
  • Docker习之Image(镜像)(2)

    摘要:而镜像名称是,因此将会获取官方镜像仓库中标签为的镜像。如并且下载结束后,给出该镜像完整的的摘要,以确保下载一致性。这是指用镜像为基础来启动容器。其中仓库名标签在之前有提到过。镜像则是镜像的唯一标识,一个镜像可以对应多个标签。 我们知道Image(镜像)是Docker的三大组件之一,Docker 运行容器前需要本地存在对应的镜像,如果本地不存在该镜像,Docker 会从镜像仓库下载该镜像...

    Jokcy 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<