用于统一开发和部署的轻量级 Linux 容器(4)

Docker的工作流程

有多种方式可以把Docker引入到开发和部署过程里。让我们看看演示工作流程的例子,如图4。我们设想一个公司的开发人员可能运行安装了Docker的Ubuntu。他可能从公共注册中心下载映像或者上传映像到公共注册中心,并在这个映像的基础上安装自己的代码或者公司专有知识产权的软件,还要生成可上传到公司私有注册中心的映像。

在这个例子里,公司的产品质量测试环境运行的CentOS和Docker。它也从公共或者私有的注册中心下载映像,然后再环境更新的时候启动各种容器。

最后,为了方便扩展和伸缩,公司把生产环境部署在云中,即部署在亚马逊的WEB服务上(AWS)。亚马逊Linux上也运行了管理不同容器的Docker。

注意:上面的所有三个环境运行着不同版本的Linux,但这三个环境都与Docker兼容。而且每个环境都运行着不同的容器组合。然而,由于每个容器都把自己的依赖同其他容器分离开来,因此不存在任何冲突,所有容器都平安地并存着。

用于统一开发和部署的轻量级 Linux 容器

图4.使用Docker进行软件开发的工作流程举例

认识到Docker提供的是一个以应用为核心的容器模型是非常重要的。也就是说,容器运行的是单独的应用或者服务,而不是许多应用或者服务。我们已经知道:创建和运行容器非常快而且消耗的资源也很少。由于你所使用的系统遵循单一责任法则,而且每个容器运行一个主进程,所以系统组件之间就是松耦合的。基于这个理念,我们自己就可以创建属于自己的,可以启动容器的映像了。

创建新的Docker映像

在前面的例子里,你已经通过命令行与Docker进行交互了。然而在创建映像的时候,更常见的是创建进行自动构建过程的"Dockerfile“。Dockerfile是简单的文本文件,它描述的是构建过程。你可以对Dockerfile实行版本控制,这样就可以就可以非常完美地重复创建映像了。

在接下来的例子里,我们将看看名字为PHP Box的Dockerfile(见代码清单1)。

代码清单1.PHP Box

# PHP Box
#
# VERSION 1.0

# use centos base image
FROM centos:6.4

# specify the maintainer
MAINTAINER Dirk Merkel, dmerkel@vivantech.com

# update available repos
RUN wget
↪epel-release-6-8.noarch.rpm; rpm -Uvh epel-release-6-8.noarch.rpm

# install some dependencies
RUN yum install -y curl git wget unzip

# install Apache httpd and dependencies
RUN yum install -y httpd

# install PHP and dependencies
RUN yum install -y php php-mysql

# general yum cleanup
RUN yum install -y yum-utils
RUN package-cleanup --dupes; package-cleanup --cleandupes;
 ↪yum clean -y all

# expose mysqld port
EXPOSE 80

# the command to run
CMD ["/usr/sbin/apachectl", "-D", "FOREGROUND"]

接下来我们仔细看看上面的Dockerfile都做了哪些事情。Dockerfile的语法是命令关键字,其后紧跟着是该命令的参数。通常命令关键字是大写的。注释部分是以#开头的。

FROM命令向你指明了所使用的基本映像。它必须是Docker文件的第一条命令。在这个例子里,你所做的工作都是建立在刚才新建的基本映像Centos上的。很显然,MAINTAINER命令则罗列出了维护这个Dockerfile的人员。RUN命令执行一条命令,并给出运行结果映像,因此它新创建了一个映像。这个Dockerfile里的RUN命令获取其他软件仓库的配置文件,然后使用Yum安装curl、git、wget、unzip、httpd、php-mysql和yum-utils。我们可以把这几个yum install命令合并成一条RUN命令,从而可以避免连续多次提交。

接下来的EXPOSE命令向外部开放端口80,它就是启动容器的时候Apache要侦听的端口号。

最后一条命令 CMD给出了容器启动时所要运行的缺省命令。启动容器就是启动一个单独的进程,这样你就可以把容器看作一条命令。

在命令行里输入docker build -t php_box .,这时Docker就会使用当前目录下的Dockerfile开始进行构建。运行所得到的最终映像将被命名为"php_box",这样,你以后就会很容易的识别和查找这个映像。

这个构建过程下载了基本映像,紧接着安装Apache httpd以及与其相关的所有依赖。完成安装之后,将返回一个用来识别新创建映像的哈希值。这个值与你在前面启动MySQL容器时所使用的值类似。你可以使用php_box标签来运行Apache和PHP映像,命令如下: docker run -d -t php_box。

下面我们将以很简短例子结束这篇文章,这个例子说明在已有的映像基础上如何简单地创建新映像:

# MyApp
#
# VERSION      1.0

# use php_box base image
FROM php_box

# specify the maintainer
MAINTAINER Dirk Merkel, dmerkel@vivantech.com

# put my local web site in myApp folder to /var/www
ADD myApp /var/www

第二个Dockerfile比第一个要简短,实际上它仅仅包含了两条真正起作用的命令。首先通过 FROM命令指定了启动的是php_box映像。然后使用 ADD命令拷贝本地一目录到这个映像。在这个例子里,拷贝到映像的Apache的DOCUMNET_ROOT文件夹的是一个PHP项目。最终得到的结果是:启动这个映像的时候默认会启动这个服务站点。

总结

轻量级应用及其依赖打包和部署工具Docker的出现是令人激动的事情,Linux社团很快采纳了它,而且还试着在生产环境中使用。例如,Red Hat在12月就宣布将在即将发布的Red Hat Linux企业版7里支持Docker。然而,Docker仍然是一个年轻的项目,而且正在飞速发展中。看到Docker项目发布1.0版本将是多么令人激动的时刻,1.0版本将是官方批准的用于生产环境的第一个版本。Docker依靠的现有的技术,其中一些技术已经具有十几年的历史了,但这并不意味着它没有任何创新。我希望这篇文章能给你足够多有关Docker的信息,并鼓励你下载Docker,亲自试一下。

Docker最新进展

在这篇文章发布的时候,Docker团队发布了版本0.8。最新的发布增加了对Mac OS X的支持,它有两个组件组成。客户端可以运行在OS X操作系统上,而Docker服务进程则运行在由boot2docker管理的轻量级VirtualBox虚拟机上,其中也包含命令行客户端。由于底层技术,比如LXC和命名空间得不到OS X的支持,所以这么做就是必然的选择。我认为大家都在期待有类似的方案能用在其他平台上,比如Windows上。

版本0.8还引入了几个新的构建特性,并试着提供对二叉树型文件系统的支持(BTRFS)。BTRFS是另一个即写即拷贝的文件系统,另外BTRFS存储驱动用来替代AuFS驱动。

尤其值得一提的是: Docker 0.8修补了许多程序漏洞,强化了性能。总的提交数量说明Docker团队为了生成可用于生产环境的发布版1.0所做的努力。因为Docker团队是每个月进行提交的,我们期望在4-5月份这个时间窗口发布1.0版本。

资源

Docker主站点: https://www.docker.io
Docker注册中心: https://index.docker.io
Docker注册中心相关的API:
Docker Hub API :

Docker远端应用API:

注解:由于翻译完成时Docker Index API已经更改为Docker Hub API,因此就采用的新的API。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/17857.html