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

介绍

Docker容器通过使用基地】映像创建。映像可以是基本的,只有操作系统的基本原理,或者它可以包括一个复杂的预构建的应用程序准备启动。 当使用docker构建映像时,每个操作(即执行的命令,如apt-get install)在上一个之上形成一个新层。这些基础映像然后可以用于创建新的容器。 在这种DigitalOcean文章中,我们将看到尽可能多的自动化这个过程,以及展示的最佳实践和方法,使大多数通过 DockerfilesDocker和容器:脚本打造容器,一步一步,逐层 - 从源(基础)映像自动生成。

词汇表

Docker简介

2. Dockerfiles

Dockerfile语法

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

4. Dockerfile命令

  1. CMD
  2. 入口点
  3. ENV
  4. 暴露
  5. MAINTAINER
  6. 用户
  7. WORKDIR

5.如何使用Dockerfiles

6. Dockerfile示例:创建要安装MongoDB的映像

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

Docker简介

项目Docker提供了更高级别的工具,共同努力,建立在某些Linux内核特性之上。 目标是帮助开发人员和系统管理员移植应用程序。 -与它们的依赖关系的共同地-并让他们在系统和机器上运行 头痛免费 。 Docker通过为称为“docker容器”的应用程序创建安全的基于LXC(即Linux容器)的环境来实现这一点。这些容器在使用 搬运工映像 ,这可以通过 Dockerfiles手动或自动执行命令建立创建。 注意:要了解更多关于Docker及零部件(如Docker守护进程,CLI,映像等),看看我们的介绍性文章,以项目: Docker解释说:入门

Dockerfiles

每个Dockerfile是一个脚本,由连续列出的各种命令(指令)和参数组成,以自动对基础映像执行操作,以创建(或形成)新的映像。它们用于组织事物,并通过简化过程从头到尾大大帮助部署。 Dockerfiles首先确定从哪个 构建过程开始的映像。随后各种其他方法,命令和参数(或条件),作为回报,提供一个新的映像,用于创建docker容器。 以各种方式- -他们可以通过提供Dockerfile的内容被用来将 Docker守护进程建立一个映像(如“如何使用”一节中)。

Dockerfile语法

在我们开始讨论Dockerfile之前,让我们快速翻阅一下它的语法和实际意义。

什么是语法?

非常简单地,编程中的语法意味着命令命令,参数以及对应用程序进行编程以执行过程(即,函数/指令集合)所需的一切的结构。 这些结构基于明确和明确定义的规则,并且程序员遵循与任何计算机应用程序(例如,解释器,守护进程等)使用或期望它们交互的接口。如果脚本(即,包含要执行的一系列任务的文件)未被正确地构造(即,错误的语法),则计算机程序将不能解析它。解析大致可以理解为经过一个输入,最终目标是理解什么意思。 Dockerfiles使用简单,干净,清晰的语法,使它们惊人地容易创建和使用。它们被设计为自我解释,特别是因为它们允许评论就像一个好的和正确的应用程序源代码。

Dockerfile语法示例

Dockerfile语法由两种主线块组成:注释和命令+参数。
# Line blocks used for commenting
command argument argument ..
一个简单的例子:
# Print "Hello docker!"
RUN echo "Hello docker!"

Dockerfile命令(指令)

目前有大约十几个不同的命令,Dockerfiles可以包含让Docker构建一个镜像。在本节中,我们将在处理Dockerfile示例之前单独讨论所有这些。 注:如前面部分(Dockerfile语法)的解释,所有这些命令上市(即写)依次单一纯文本文件(即Dockerfile)内,按顺序,你希望他们执行(即执行)由docker守护进程来构建一个镜像。 然而,这些命令(例如维护者)可以放置在任何地方,你认为适合的(但总是命令后),因为它们不构成任何执行,而是 定义 (即仅仅是一些附加信息) 的值

ADD命令获取两个参数:源和目标。它基本上将文件从主机上的源文件复制到容器自己的文件系统在设置的目的地。然而,如果源是一个URL(例如 http://github.com/user/file/ ),则URL的内容被下载并放置在目的地。 例:
# Usage: ADD [source directory or URL] [destination directory]
ADD /my_app_folder /my_app_folder

CMD

与RUN类似,命令CMD可以用于执行特定命令。但是,与RUN不同,它不会在构建期间执行,而是在使用正在构建的映像实例化容器时执行。因此,它应该被认为是一个初始的,默认的命令,它基于映像创建容器来执行(即运行)。 为了澄清:对于CMD一个例子是运行在映像内创建时是使用运行已安装的容器(如运行apt-get安装...)的应用。使用CMD设置的默认应用程序执行命令成为默认应用程序执行命令,并替换创建期间传递的任何命令。 例:
# Usage 1: CMD application "argument", "argument", ..
CMD "echo" "Hello docker!"

入口点

ENTRYPOINT参数设置每次使用映像创建容器时使用的具体默认应用程序。例如,如果您在映像中安装了特定应用程序,并且您将使用此映像仅运行该应用程序,则可以使用ENTRYPOINT命名,并且每当从该映像创建容器时,您的应用程序将成为目标。 如果你将ENTRYPOINT与CMD耦合,你可以从CMD中删除“应用程序”,只是留下“参数”,将传递到ENTRYPOINT。 例:
# Usage: ENTRYPOINT application "argument", "argument", ..
# Remember: arguments are optional. They can be provided by CMD
#           or during the creation of a container. 
ENTRYPOINT echo

# Usage example with CMD:
# Arguments set with CMD can be overridden during *run*
CMD "Hello docker!"
ENTRYPOINT echo  

ENV

ENV命令用于设置环境变量(一个或多个)。这些变量由“key = value”对组成,可以在容器内通过脚本和应用程序访问。 docker的这个功能为运行程序提供了巨大的灵活性。 例:
# Usage: ENV key value
ENV SERVER_WORKS 4

暴露

EXPOSE命令用于关联指定的端口,以启用容器中运行的进程与外部世界(即主机)之间的网络连接。 例:
# Usage: EXPOSE [port]
EXPOSE 8080
要了解端口,检查出这个文件 端口重定向

FROM指令可能是所有其他Dockerfiles最关键的。它定义用于启动构建过程的基本映像。它可以是任何映像,包括您之前创建的映像。如果从映像中没有发现主机,搬运工将尝试从 Docker映像索引找到它(下载)。它需要是在Dockerfile中声明的第一个命令。 例:
# Usage: FROM [image name]
FROM ubuntu

MAINTAINER

可以在文件中任何位置设置的命令之一 - 虽然如果在顶部声明它会更好 - 是MAINTAINER。此非执行命令声明作者,因此设置映像的作者字段。它应该来自FROM之后。 例:
# Usage: MAINTAINER [name]
MAINTAINER authors_name

RUN命令是Dockerfiles的中央执行指令。它需要一个命令作为其参数,并运行它来形成映像。不像CMD,它实际上 用来建立映像(形成于前一个是致力于之上另一层)。 例:
# Usage: RUN [command]
RUN aptitude install -y riak

用户

USER指令用于设置要根据正在构建的映像运行容器的UID(或用户名)。 例:
# Usage: USER [UID]
USER 751

VOLUME命令用于启用从您的容器到主机上的目录(即安装它)的访问。 例:
# Usage: VOLUME ["/dir_1", "/dir_2" ..]
VOLUME ["/my_files"]

WORKDIR

WORKDIR指令用于设置要用CMD定义的命令的执行位置。 例:
# Usage: WORKDIR /path
WORKDIR ~/

如何使用Dockerfiles

使用Dockerfiles就像使docker守护进程运行一样简单。执行脚本后的输出将是新的docker映像的ID。 用法:
# Build an image using the Dockerfile at current location
# Example: sudo docker build -t [name] .
sudo docker build -t my_mongodb .    

Dockerfile示例:创建要安装MongoDB的映像

在Dockerfiles的最后一节中,我们将创建一个Dockerfile文档并逐步填充它,最终得到一个Dockerfile,它可以用来创建一个docker镜像来运行MongoDB容器。 注:在开始编辑Dockerfile后,所有从下面的部分内容和参数将被写入(追加),它内部的先后,按照我们的榜样,从 Docker语法部分的解释。您可以在本演练的最新部分看到最终结果。

创建空Dockerfile

使用nano文本编辑器,让我们开始编辑我们的Dockerfile。
sudo nano Dockerfile

定义我们的文件及其目的

虽然可选,总是一个好的做法,让自己和每个人都(当必要时)找出这个文件是什么,它打算做什么。对于这一点,我们将开始我们的花哨的意见(I#)Dockerfile来形容 - 有它像时尚的年轻人
############################################################
# Dockerfile to build MongoDB container images
# Based on Ubuntu
############################################################

设置要使用的基本映像

# Set the base image to Ubuntu
FROM ubuntu

定义维护者(作者)

# File Author / Maintainer
MAINTAINER Example McAuthor

更新应用程序存储库列表

注意:此步骤是没有必要的,因为我们没有使用正确的资源库之后。然而,它可以被认为是良好的做法。
# Update the repository sources list
RUN apt-get update

设置下载MongoDB的参数和命令

################## BEGIN INSTALLATION ######################
# Install MongoDB Following the Instructions at MongoDB Docs
# Ref: http://docs.mongodb.org/manual/tutorial/install-mongodb-on-ubuntu/

# Add the package verification key
RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10

# Add MongoDB to the repository sources list
RUN echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' | tee /etc/apt/sources.list.d/mongodb.list

# Update the repository sources list once more
RUN apt-get update

# Install MongoDB package (.deb)
RUN apt-get install -y mongodb-10gen

# Create the default data directory
RUN mkdir -p /data/db

##################### INSTALLATION END #####################

设置MongoDB的默认端口

# Expose the default port
EXPOSE 27017

# Default port to execute the entrypoint (MongoDB)
CMD ["--port 27017"]

# Set default container command
ENTRYPOINT usr/bin/mongod

保存Dockerfile

将所有内容附加到文件后,即可保存并退出。按CTRL + X然后按Y确认并保存Dockerfile。
这是最终文件应该是什么样子:
############################################################
# Dockerfile to build MongoDB container images
# Based on Ubuntu
############################################################

# Set the base image to Ubuntu
FROM ubuntu

# File Author / Maintainer
MAINTAINER Example McAuthor

# Update the repository sources list
RUN apt-get update

################## BEGIN INSTALLATION ######################
# Install MongoDB Following the Instructions at MongoDB Docs
# Ref: http://docs.mongodb.org/manual/tutorial/install-mongodb-on-ubuntu/

# Add the package verification key
RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10

# Add MongoDB to the repository sources list
RUN echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' | tee /etc/apt/sources.list.d/mongodb.list

# Update the repository sources list once more
RUN apt-get update

# Install MongoDB package (.deb)
RUN apt-get install -y mongodb-10gen

# Create the default data directory
RUN mkdir -p /data/db

##################### INSTALLATION END #####################

# Expose the default port
EXPOSE 27017

# Default port to execute the entrypoint (MongoDB)
CMD ["--port 27017"]

# Set default container command
ENTRYPOINT usr/bin/mongod

建立我们的第一个映像

使用之前的解释,我们准备创建我们的第一个MongoDB映像与docker!
sudo docker build -t my_mongodb .
注:这里的 -t [名]标志用于标记的映像。 要了解更多有关你可以建立在做些什么,运行 sudo docker build --help

运行MongoDB实例

利用我们打造的形象,我们现在可以继续最后一步:创建一个容器中运行的MongoDB实例,用我们选择的名称(如果需要的话 -name [名])。
sudo docker run -name my_first_mdb_instance -i -t my_mongodb
注意:如果未设置一个名字,我们将需要处理,可以通过列出使用所有容器中获得复杂的字母数字标识 sudo docker ps -l注:从容器脱离自己,使用转义序列CTRL + P然后CTRL + Q。 请享用!
:提交 OS Tezer
赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏