手把手教你使用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都有很好的文档,并且举例给予了说明(见资源一节)。 Docker的工作流程有多种方式可以把Docker引入到开发和部署过程里。让我们看看演示工作流程的例子,如图4。我们设想一个公司的开发人员可能运行安装了Docker的Ubuntu。他可能从公共注册中心下载映像或者上传映像到公共注册中心,并在这个映像的基础上安装自己的代码或者公司专有知识产权的软件,还要生成可上传到公司私有注册中心的映像。 在这个例子里,公司的产品质量测试环境运行的Centos和Docker。它也从公共或者私有的注册中心下载映像,然后再环境更新的时候启动各种容器。 最后,为了方便扩展和伸缩,公司把生产环境部署在云中,即部署在亚马逊的WEB服务上(AWS)。亚马逊Linux上也运行了管理不同容器的Docker。 注意:上面的所有三个环境运行着不同版本的Linux,但这三个环境都与Docker兼容。而且每个环境都运行着不同的容器组合。然而,由于每个容器都把自己的依赖同其他容器分离开来,因此不存在任何冲突,所有容器都平安地并存着。
图4.使用Docker进行软件开发的工作流程举例
认识到Docker提供的是一个以应用为核心的容器模型是非常重要的。也就是说,容器运行的是单独的应用或者服务,而不是许多应用或者服务。我们已经知道:创建和运行容器非常快而且消耗的资源也很少。由于你所使用的系统遵循单一责任法则,而且每个容器运行一个主进程,所以系统组件之间就是松耦合的。基于这个理念,我们自己就可以创建属于自己的,可以启动容器的映像了。 |