Docker 解说:使用 Dockerfiles 自动构建映像

<$>[警告]

状态: 已弃用

本文已弃用,不再维护。

原因

本文中的技术已经过时,可能不再反映Docker的最佳实践。

请参阅

<$>

简介


Docker 容器是使用_base_Image创建的。一个映像可以是基本的,除了操作系统基础之外什么都没有,或者它可以由一个复杂的预构建的应用程序堆栈组成,随时可以启动。

在使用Docker构建镜像时,每执行一次操作(即执行一个命令,如apt-Get Install),都会在前一层之上形成一个新层。然后可以使用这些基本图像来创建新的容器。

在这篇有关DigitalOcean的文章中,我们将了解如何尽可能地自动化这一过程,并演示如何通过_Dockerfiles_:脚本从基本图像自动构建容器,从而最大限度地利用Docker和容器。

词汇表


1.Docker简介


2.Docker文件


3.Dockerfile语法


1.什么是语法? 2.Dockerfile语法示例

4.Dockerfile命令


1.添加 2.CMD 3.入口点 4.环境 5.揭露 6.出发地 7.维护员 8.跑步 9.用户 第十卷。 11.WorkDir

5.如何使用Dockerfile


6.Dockerfile示例:创建镜像安装MongoDB


1.创建空的Dockerfile 2.定义我们的文件及其目的 3.设置要使用的基础映像 4.定义维护者(作者) 5.更新应用程序存储库列表 6.设置参数和命令以下载MongoDB 7.设置MongoDB的默认端口 8.保存Dockerfile 9.建立我们的第一个形象 10.运行MongoDB实例

Docker简介


Docker项目提供了协同工作的更高级别的工具,这些工具构建在一些linux内核特性之上。其目标是帮助开发人员和系统管理员移植应用程序--以及它们的所有依赖项--并让它们在系统和机器之间运行,让人头疼不已。

Docker通过为称为)环境来实现这一点。这些容器是使用_Docker镜像_创建的,可以手动执行命令,也可以通过DockerFiles 自动创建。

注意: 要了解Docker及其部件(例如Docker守护进程、CLI、镜像等)的更多信息,查看我们的介绍性文章:如何在Ubuntu 16.04上安装和使用Docker

坞站文件


每个Docker文件都是一个脚本,由顺序列出的各种命令(指令)和参数组成,以自动对基本映像执行操作,以创建(或形成)新的映像。它们用于组织事物,并通过从头到尾简化流程来极大地帮助部署。

DockerFiles首先定义一个映像,构建进程将从该映像启动。后跟各种其他方法、命令和参数(或条件),作为回报,提供用于创建停靠容器的新图像。

可以通过各种方式将Dockerfile的内容提供给 docker daemon 来构建镜像(如** 如何使用 ** 部分所述)。

dockerfile语法


在我们开始讨论Dockerfile之前,让我们快速了解一下它的语法以及它的实际含义。

什么是语法?


很简单,编程中的语法意味着对命令、参数和对应用程序进行编程以执行过程(即函数/指令集合)所需的所有其他内容进行排序的结构。

这些结构基于明确定义的规则,程序员应遵循这些规则与任何计算机应用程序(例如解释器、守护程序等)进行交互。使用或期待它们。如果脚本(即包含要执行的一系列任务的文件)的结构不正确(即语法错误),则计算机程序将无法对其进行解析。粗略地可以将解析理解为检查输入,最终目标是理解其含义。

Dockerfile使用简单、干净和清晰的语法,这使得它们非常容易创建和使用。它们被设计为不言自明,特别是因为它们允许像良好和正确编写的应用程序源代码一样进行注释。

Dockerfile实例


Dockerfile语法由两种主要行块组成:注释和命令+参数。

1# Line blocks used for commenting
2command argument argument ..

简单示例:

1# Print "Hello docker!"
2RUN echo "Hello docker!"

Dockerfile命令(使用说明)


目前,Dockerfiles可以包含大约十几个不同的命令集来让Docker构建镜像。在本节中,我们将在处理Dockerfile示例之前单独讨论所有这些。

注意: 正如上一节(Dockerfile语法)所解释的,所有这些命令都是在一个纯文本文件(即Dockerfile)中按您希望由docker守护进程执行(即执行)以构建镜像的顺序依次列出(即写入)的。然而,这些命令中的一些(例如Maintainer)可以放在您认为合适的任何位置(但总是在from命令之后),因为它们不构成任何执行,而是定义的值(即,只是一些附加信息)。

添加


ADD命令有两个参数:一个源和一个目标。它基本上将文件从主机上的源复制到容器自己的文件系统中。但是,如果源是一个URL(例如http://github.com/user/file/),那么URL的内容将被下载并放置在目的地。

示例:

1# Usage: ADD [source directory or URL] [destination directory]
2ADD /my_app_folder /my_app_folder

CMD


命令CMD与RUN类似,可用于执行特定命令。然而,与Run不同的是,它不是在构建期间执行的,而是在使用正在构建的映像实例化容器时执行。因此,它应该被视为在基于映像创建容器时执行(即运行)的初始默认命令。

澄清一下: cmd的一个例子是在创建一个已经使用Run安装的容器时运行一个应用程序(例如,run apt-Get Install…)在图像内部。这个用CMD设置的默认应用程序执行命令将成为默认命令,并取代在创建过程中传递的任何命令。

示例:

1# Usage 1: CMD application "argument", "argument", ..
2CMD "echo" "Hello docker!"

入口点


入口点参数设置每次使用图像创建容器时使用的具体默认应用程序。例如,如果您已经在映像中安装了特定的应用程序,并且您将使用该映像仅运行该应用程序,则可以使用入口点来声明它,并且每当从该映像创建容器时,您的应用程序都将成为目标。

如果您将入口点与CMD结合在一起,您可以从CMD中删除应用程序,只留下将传递给入口点的参数

示例:

1# Usage: ENTRYPOINT application "argument", "argument", ..
2# Remember: arguments are optional. They can be provided by CMD
3#           or during the creation of a container.
4ENTRYPOINT echo
5
6# Usage example with CMD:
7# Arguments set with CMD can be overridden during *run*
8CMD "Hello docker!"
9ENTRYPOINT echo

ENV


ENV命令用于设置环境变量(一个或多个)。这些变量由键值对组成,脚本和应用程序都可以在容器中访问它们。Docker的这一功能为运行程序提供了极大的灵活性。

示例:

1# Usage: ENV key value
2ENV SERVER_WORKS 4

博览会


Expose命令用于关联指定的端口,以实现容器内部正在运行的进程与外部世界(即主机)之间的联网。

示例:

1# Usage: EXPOSE [port]
2EXPOSE 8080

要了解DOCKER网络,请查看DOCKER容器网络documentation.

来自


在Dockerfile的所有其他指令中,from指令可能是最关键的。它定义用于启动构建过程的基本映像。它可以是任何图像,包括您之前创建的图像。如果在主机上找不到From镜像,Docker会尝试从Docker Hub 或其他容器存储库中找到(并下载)。它需要是Dockerfile中声明的第一个命令。

示例:

1# Usage: FROM [image name]
2FROM ubuntu

维护者


可以在文件中的任何位置设置的命令之一是MAINTAINER(尽管最好是在顶部声明)。这个非执行命令声明了作者,因此设置了图像的作者字段。但它应该是从后面来的。

示例:

1# Usage: MAINTAINER [name]
2MAINTAINER authors_name

运行


Run命令是Dockerfile的中央执行指令。它将命令作为其参数,并运行该命令以形成映像。与CMD不同,它实际上是**用于构建镜像(在已提交的上一层之上形成另一层)。

示例:

1# Usage: RUN [command]
2RUN aptitude install -y riak

用户


USER指令用于设置UID(或用户名),该UID将基于正在构建的映像运行容器。

示例:

1# Usage: USER [UID]
2USER 751


VOLUME命令用于允许从您的容器访问主机上的目录(即挂载)。

示例:

1# Usage: VOLUME ["/dir_1", "/dir_2" ..]
2VOLUME ["/my_files"]

工作目录


WORKDIR指令用于设置执行使用CMD定义的命令的位置。

例如:

1# Usage: WORKDIR /path
2WORKDIR ~/

Dockerfile的使用方法


使用Dockerfile就像让Docker守护进程运行一个文件一样简单。执行脚本后的输出将是新docker图像的ID。

使用方法:

1# Build an image using the Dockerfile at current location
2# Example: docker build -t [name] .
3docker build -t my_mongodb .

Dockerfile示例:创建镜像安装MongoDB


在Dockerfile的最后一节中,我们将创建一个Dockerfile文档,并使用Dockerfile的最终结果逐步填充它,Dockerfile可用于创建用于运行MongoDB容器的docker映像。

注意: 开始编辑Dockerfile后,下面几节中的所有内容和参数都将按照我们在** Docker语法** 一节中的示例和解释依次写入(追加)到Dockerfile中。您可以在本演练的最新部分看到最终结果。

创建空Dockerfile


使用Nano文本编辑器,让我们开始编辑Dockerfile。

1nano Dockerfile

定义我们的文件及其用途


尽管是可选的,但让您自己和每个人(在必要时)弄清楚这个文件是什么以及它的目的总是一个很好的实践。为此,我们将以花哨的注释(# )开始我们的Dockerfile来描述它。

1############################################################
2# Dockerfile to build MongoDB container images
3# Based on Ubuntu
4############################################################

设置基础镜像使用


1# Set the base image to Ubuntu
2FROM ubuntu

定义Maintainer(作者)


1# File Author / Maintainer
2MAINTAINER Example McAuthor

设置MongoDB下载参数和命令


 1################## BEGIN INSTALLATION ######################
 2# Install MongoDB Following the Instructions at MongoDB Docs
 3# Ref: http://docs.mongodb.org/manual/tutorial/install-mongodb-on-ubuntu/
 4
 5# Add the package verification key
 6RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10
 7
 8# Add MongoDB to the repository sources list
 9RUN echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' | tee /etc/apt/sources.list.d/mongodb.list
10
11# Update the repository sources list
12RUN apt-get update
13
14# Install MongoDB package (.deb)
15RUN apt-get install -y mongodb-10gen
16
17# Create the default data directory
18RUN mkdir -p /data/db
19
20##################### INSTALLATION END #####################

设置MongoDB默认端口


1# Expose the default port
2EXPOSE 27017
3
4# Default port to execute the entrypoint (MongoDB)
5CMD ["--port 27017"]
6
7# Set default container command
8ENTRYPOINT usr/bin/mongod

保存Dockerfile


将所有内容追加到文件后,就可以保存并退出了。按CTRL+X,然后按Y确认并保存Docker文件。

最终文件应该是这样的:

 1############################################################
 2# Dockerfile to build MongoDB container images
 3# Based on Ubuntu
 4############################################################
 5
 6# Set the base image to Ubuntu
 7FROM ubuntu
 8
 9# File Author / Maintainer
10MAINTAINER Example McAuthor
11
12################## BEGIN INSTALLATION ######################
13# Install MongoDB Following the Instructions at MongoDB Docs
14# Ref: http://docs.mongodb.org/manual/tutorial/install-mongodb-on-ubuntu/
15
16# Add the package verification key
17RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10
18
19# Add MongoDB to the repository sources list
20RUN echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' | tee /etc/apt/sources.list.d/mongodb.list
21
22# Update the repository sources list
23RUN apt-get update
24
25# Install MongoDB package (.deb)
26RUN apt-get install -y mongodb-10gen
27
28# Create the default data directory
29RUN mkdir -p /data/db
30
31##################### INSTALLATION END #####################
32
33# Expose the default port
34EXPOSE 27017
35
36# Default port to execute the entrypoint (MongoDB)
37CMD ["--port 27017"]
38
39# Set default container command
40ENTRYPOINT usr/bin/mongod

打造我们的第一个镜像


使用前面的解释,我们已经准备好使用docker创建我们的第一个MongoDB镜像!

1docker build -t my_mongodb .

注意: 这里的** -t[名称]** 标志是用来标记镜像的。要了解有关在构建期间还可以执行哪些操作的更多信息,请运行docker build--help

运行MongoDB实例


使用我们构建的映像,我们现在可以继续执行最后一步:使用我们选择的名称(如果需要,可以使用**-name[name]** )在其中创建一个运行MongoDB实例的容器。

1docker run -name my_first_mdb_instance -i -t my_mongodb

注意: 如果没有设置名称,我们将需要处理复杂的字母数字ID,这些ID可以通过docker ps-l列出所有容器获得。

注意: 若要脱离容器,请使用转义序列CTRL+P,后跟CTRL+Q

好好享受吧

Submitted by: O.S. Tezer
Published At
Categories with 技术
comments powered by Disqus