当前位置: > Linux服务器 > Docker >

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

时间:2015-12-13 21:46来源:linux.it.net.cn 作者:IT

Docker仓库

Docker杀手级特性之一就是能够快速的查找、下载和启动由其他开发者创建的容器映像。存储映像的地方称为注册中心。Docker有限公司提供一个公共的注册中心,这个注册中心也称为索引中心。你可以把这个注册中心和Docker客户端看作与Node的NPM,Perl的CPAN或者Ruby的RubyGems等同。

除了可以用来创建Docker容器的各种基本映像外,公共的Docker注册中心还提供即刻即可运行的软件映像,其中包括数据库、内容管理系统、开发环境和Web服务器等等。默认情况下Docker命令行客户端搜索的是公共的注册中心,不过,也可以维护私有的注册中心。如果要发布含有专有知识产权代码的或者仅公司内部使用的组件的映像,那么注册中心就是一个很好的选择。把映像上传到注册中心就像下载一样容易。只要求你创建一个账户,而且这一切都是免费的。最后,Dcoker有限公司的注册中心还有Web界面,方便对映像进行搜索、读取、评论和推荐(即“标记星号”)。映像使用起来出奇的容易,我鼓励你这篇文档资源一小节里的链接,开始浏览映像。

 

手把手教你使用Docker

Docker是有单个二进制文件组成的,这个二进制文件可以以三种方式来运行。第一种,它可以作为管理容器的服务进程运行。服务进程向外提供既可以进行本地访问也可以进行远程访问的基于REST风格的API。越来越多的客户端数据库可与服务进程API进行通信,其中包括Ruby,Python,JavaScript(Angular和Node),Erlang,Go和PHP提供的客户端库.

客户端库大多数情况下都是通过编程来来访问服务进程的,不过更经常使用的情况则是通过命令行提交指令。这也就是运行Dcoker二进制文件的第二种方式,即通过命令行客户端访问基于REST风格的服务进程。

第三种方式,Docker二进制文件可以运行为访问远程映像仓库的客户端。生成容器文件系统的映像被称作仓库。用户可以下载别人提供的映像,还可以上传自己的映像到注册中心,从而共享这些映像。注册中心用来收集,罗列和组织这些仓库。

 

让我们看看实际中运行Docker的这三种方式。在下面的例子里,你将搜索Docker仓库,查找MySQL映像。因此你找到所喜欢的映像,然后下载它,接着告诉Docker服务进程运行对应的命令(MySQL)。你所做的这些操作都是通过命令行进行的。

图3.下载Docker映像并启动容器

一开始,先运行docker search mysql命令,这条命令将显示公共Docker注册中心里匹配关键词"mysql"的映像列表。我确定这条命令可以正常运行,接着使用命令docker pull brice/mysql下载"brice/mysql"映像。你可以看到Docker不仅仅下载的是你所指定的映像,而且还可以下载依赖这个包所建立的其他映像。输入docker images命令,将会罗列出目前本地具有的所有映像,其中包括了"brice/mysql"映像。使用-d选项启动容器,它将会脱离当前运行的容器之外运行一个容器,此时,你已经在一个容器里运行了MySQL了。你可以使用docker ps命令来验证,这条命令经罗列出运行的容器,而不是罗列出映像。在命令行的输出里,你还能看到MySQL服务侦听的端口号,默认是3306。

 

然而,在知道MySQL运行在容器内部情况下,你该怎样连接到MySQL呢?切记:每个Docker容器有自己的网络接口。你需要确定的是mysqld服务器进程运行在哪个IP地址和端口上。运行docker inspect <imageId>命令,它将给我们提供大量的信息。不过,由于你所需要的仅仅是IP地址,所以当你使用容器的哈希值对容器进行查看的时候,你就可以抓取到IP地址,即运行docker inspect 5a9005441bb5 | grep IPAddress。现在你可以通过给标准的MYSQL CLI客户端指定主机地址和端口选项来连接了。当你使用完MySQL服务器后,你可以使用命令docker stop 5a9005441bb5关闭这个容器了。

我们使用了7条命令查找、下载、启动运行MySQL服务器的Docker容器以及使用完后关闭这个容器。在这个过程中,你不必担心与已安装软件之间存在的冲突,也不必担心MySQL的版本有什么不一样,或者存在哪些包依赖。你使用了7条不同的Docker命令:search、pull、images、run、ps、inspect和stop,不过,Docker客户端实际上有33条命令。你可以通过命令运行docker help命令或者查找在线手册来查阅全部命令列表。

 

在上面例子里进行Docker操作之前,我就提到了客户端与服务进程和Docker注册中心之间的通信是通过基于REST的Web服务而进行的。这就隐含地告诉你可以使用本地Docker客户端与远程的服务进程通信,从而可以有效地管理远端服务器上的容器了。Docker站点上对Docker服务进程、注册中心和索引的API都有很好的文档,并且举例给予了说明(见资源一节)。

Docker的工作流程

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

 

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

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

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

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


 

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

创建新的Docker映像

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

 

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

代码清单1.PHP Box

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# 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 http://dl.fedoraproject.org/pub/epel/6/x86_64/
↪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。

 

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

?
1
2
3
4
5
6
7
8
9
10
11
12
# 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: http://docs.docker.com/reference/api/registry_api/ 
Docker Hub API :http://docs.docker.com/reference/api/docker-io_api/

Docker远端应用API:http://docs.docker.com/reference/api/docker_remote_api/

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

(责任编辑:IT)
------分隔线----------------------------
栏目列表
推荐内容