Docker和虚拟机-亦敌亦友
上面我们一直在对Docker和虚拟机进行比较,现在该看看这两种技术彼此在哪些方面是真正互补的。Docker在虚拟化的环境下运行的非常好。很显然,你不需要对各个虚拟主机的每个应用或者组件进行封装。而且假定给你一台Linux虚拟机,你就能够很容易地部署上Docker容器。这也就是在非Linux系统,比如OS X和Windows上运行Docker的官方安装方式是在Vagrant的协助下安装基于Ubuntu虚拟机的Precise64不让你感到吃惊的原因所在。站点有详细并且简单的指令。
首先,虚拟化和容器在某些方面表现的非常相似。一开始,这让你觉得容器就是非常轻量的虚拟机。然而,随着你对容器的认识,你对容器的理解就会有微妙的并且是重大的不同。Docker在容器最擅长的领域即轻量级应用的打包和部署方面都能充分发挥容器的长处。
Docker仓库Docker杀手级特性之一就是能够快速的查找、下载和启动由其他开发者创建的容器映像。存储映像的地方称为注册中心。Docker有限公司提供一个公共的注册中心,这个注册中心也称为索引中心。你可以把这个注册中心和Docker客户端看作与Node的NPM,Perl的CPAN或者Ruby的RubyGems等同。
除了可以用来创建Docker容器的各种基本映像外,公共的Docker注册中心还提供即刻即可运行的软件映像,其中包括数据库、内容管理系统、开发环境和Web服务器等等。默认情况下Docker命令行客户端搜索的是公共的注册中心,不过,也可以维护私有的注册中心。如果要发布含有专有知识产权代码的或者仅公司内部使用的组件的映像,那么注册中心就是一个很好的选择。把映像上传到注册中心就像下载一样容易。只要求你创建一个账户,而且这一切都是免费的。最后,Dcoker有限公司的注册中心还有Web界面,方便对映像进行搜索、读取、评论和推荐(即“标记星号”)。映像使用起来出奇的容易,我鼓励你这篇文档资源一小节里的链接,开始浏览映像。
手把手教你使用DockerDocker是有单个二进制文件组成的,这个二进制文件可以以三种方式来运行。第一种,它可以作为管理容器的服务进程运行。服务进程向外提供既可以进行本地访问也可以进行远程访问的基于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都有很好的文档,并且举例给予了说明(见资源一节)。