Docker生态系统一览

本文旨在介绍当前可用的Docker生态系统存在哪些部分,包括:Docker Hub、Docker Engine、Kitematic、Docker Machine、Swarm、Docker Compose、Dokcer Cloud以及Data Center,文章会详细介绍这些工具的功能,以及怎样能够更好地将这些工具结合起来。

在过去的18个月内参加任何技术相关的活动或者阅读任何技术相关的文章时,你可能已经听说过Docker并且对Docker是什么以及它是用来做什么的略有所知。

简单来说,Docker是建立在过去的一些概念之上,但是对这些概念进行了更好的封装。Docker是一个用来创建“容器”的工具,这些容器仅仅包含你所需要的一个独立的应用或者技术堆栈。与虚拟机不同的是,这些容器共享相同的资源来管理容器与主机之间的相互作用。这一点使得Docker容器快速、轻量、安全并且共享。

“Docker建立在过去的概念之上但又对这些概念进行了更好的封装。”via @ChrisChinch

就我个人而言,作为一个技术作家和主持人,我发现Docker对于创建演示文稿是非常宝贵的。我可以组装一堆我需要的组件,运行它们,然后再摧毁我不再需要的包和数据,以保持我的系统干净整洁。

许多开发人员在开发和测试过程中能够看到一个清晰的Docker用例,但是仍然想要了解Docker在生产中如何最好地工作。一系列第三方工具和服务的出现用来帮助开发人员从开发到生产过程中部署、配置和管理他们的Docker工作流程。

Docker已经通过一系列收购和产品发布建立了自己的“官方”工具包。众所周知,Orca项目在去年美国的DockerCon大会上公布了,虽然细节有点模糊。在我看来,与其说Orca是一个实际的项目或者产品,还不如说它其实是Docker不断增长的产品组合的巩固策略。

所以在这篇文章中,我会提出关于当前可用的Docker生态系统有哪些部分,它们如何帮助你,以及怎样更好地组合它们的一个总结。

让我们讨论一下Docker生态系统的组成部分以及这些组成部分是如何配合在一起的。

Docker Hub

任何使用Docker的项目的核心是一个Dockerfile文件。这个文件包含Docker如何创建一个镜像的指示说明。让我们来看一个简单的例子:

FROM python:2.7

ADD . /code

WORKDIR /code

RUN pip install -r requirements.txt

在这个例子中,该Dockerfile文件拉取一个特定版本的现有镜像,将当前本地目录复制进容器的文件系统,并设置它为工作目录,然后通过pip命令从一个文本文件下载Python依赖。

Docker Hub是预先写好的Dockerfile官方资源,提供公共的(免费的)和私人的(付费的)镜像存储库。如果你正在寻找一个Dockerfile来满足你的需求,首先在Docker Hub上搜索,使用项目文档、下载量和镜像等级来帮助指导你的决定。

Docker Engine

Docker Engine创建Dockerfile文件并把它们转化为可用的容器。Docker Engine是Docker的核心,如果没有Docker Engine那么什么也运行不了。依据你的操作系统不同有几种下载Docker Engine的方案,你可以在这里发现更多的细节(https://docs.docker.com/engine/installation/)。

依据Docker Hub中的一个镜像开启一个容器,应该首先拉取这个镜像并运行它。继续以Python为例:

docker pull python

docker run -it --rm --name script-name -v "$PWD":/usr/src/appname -w /usr/src/appname python:3 python app.py

这样就会拉取最新的Python镜像然后开启一个容器运行一个Python脚本并且运行完后退出容器。run命令提供了更多的选项设置,你可以在这里阅读完整的指南(https://docs.docker.com/engine/reference/commandline/run/)。

当一个Docker run命令开始变得更为复杂,它可以创建自己的自定义Dockerfile文件或许是一个更好的主意。开启一个基于本地Dockerfile文件的容器,运行以下里面包含文件的目录:

docker build -t my_image .

这个命令将会创建一个名为my_image的镜像。运行以下命令开启一个基于这个镜像的容器:

docker run -name my_image_container -i -t my_image

这个命令会开启一个基于自定义的my_image镜像的容器,这个容器命名为my_image_container。

Kitematic

对于那些宁愿避免命令行的用户来说,Kitematic是Mac OS X和Windows的一个伟大的GUI。搜索你需要的镜像,创建一个容器,你最好去Kitematic。Kitematic提供了基本的配置选项,但对于更高级的设置,你可能需要进入命令行。

你的容器出现在左手边,在那里它们可以被启动、停止、重启,更有用的是,你可以在那里找到容器日志和直接SSH(exec按键)访问。

Docker Machine和Swarm

生产中使用Docker的第一步是了解Machine和Swarm,它们为各种虚拟化和云服务提供商提供了一套简单的工具集用以移动和缩放他们的本地项目。

生产中使用Docker的第一步是了解Machine和Swarm。

例如,在Azure上创建一个Docker实例:

docker-machine create -d azure --azure-subscription-id="XXX" --azure-subscription-cert="/mycert.pem" ecodemo

这个命令使用预装的Docker创建一个Ubuntu 12.04-based虚拟机并命名为ecodemo。每个供应商都需要不同的参数和认证方法,这些默认设置可以被重写。在这个(https://docs.docker.com/machine/concepts/)文档中可以阅读到更多的细节。

当与Swarm结合后,Machine可以创建Docker实例的集群,这个集群被视为一个单一的、大的Docker实例。每一个Swarm集群都需要一个master实例,这个master实例可以用下面的命令来创建:

docker-machine create

-d virtualbox

--swarm

--swarm-master

--swarm-discovery token://TOKEN_ID

swarm-master

这样就会在VirtualBox中创建一个Docker实例并且设置这个Docker实例为Swarm集群的一个master节点。TOKEN_ID非常重要,因为它可以帮助集群中的所有节点识别彼此。除了手动创建TOKEN_ID标识以外,Swarm也有发现系统来帮助你管理这个过程。

下面的命令使用相同的TOKEN_ID标识添加Docker实例到Swarm集群:

docker-machine create

-d virtualbox

--swarm

--swarm-discovery token://TOKEN_ID

swarm-node-n

swarm-node-n对于集群中的每一个节点来说都是一个唯一的名字。

现在,代替从单个虚拟机中开启容器,你可以在集群中开启容器,master节点将会把这个容器分配给最可用的和最有能力的节点。

Docker Compose

Compose使得由多个组件(像容器)组成的应用程序更加简单,你可以开始使用一个命令在一个单一的配置文件中声明所有这些组件。

下面是一个Compose文件(称为docker-compose.yml)的例子,这个例子创建三个Crate数据库实例和一个Laravel(用一些额外的配置)PHP框架实例。最重要的是,容器与Links配置选项相连。

crate1:

image: crate

ports:

- "4200:4200"

- "4300:4300"

crate2:

image: crate

crate3:

image: crate

volumes:

- ./data:/importdata

laravelcomposer:

image: dylanlindgren/docker-laravel-composer

volumes:

- /laravel-application:/var/www

command: --working-dir=/var/www install

links:

- crate1

laravelartisan:

image: dylanlindgren/docker-laravel-artisan

links:

- crate1

volumes_from:

- laravelcomposer

working_dir: /var/www

command: serve --host=0.0.0.0:8080

ports:

- "8000:8000"

- "8080:8080"

所有这些实例和它们的配置现在可以通过运行以下在同一目录中的docker-compose.yml文件的命令来开始:

docker-compose up

你可以使用相同的子命令作为Docker的命令来影响所有以docker-compose开始的容器。例如,docker-compose stop命令可以停止以docker-compose开始的容器。

Docker Cloud

容器的自动化管理和编排是Docker的主要功能,但却一直由第三方服务来提供,直到去年Docker获得了Tutum(它支撑着Docker云)。虽然没有完整的命令行工具(还没有),Docker云服务允许Docker Compose文件设置应用程序栈,所以它不是来自于生态型的其它部分的一个大的导流。

容器的自动化管理是Docker的重要组成,但知道最近一直由第三方来提供。

例如:

crate1:

image: crate

ports:

- "4200:4200"

- "4300:4300"

command: crate -Des.network.publish_host=_ethwe:ipv4_

crate2:

image: crate

command: crate -Des.network.publish_host=_ethwe:ipv4_

crate3:

image: crate

command: crate -Des.network.publish_host=_ethwe:ipv4_

这样就创建了同一个镜像的三个实例,其中一个手动设置主机与Docker之间的端口分配,其他的端口分配是自动的。我将很快重新访问command。

如果你想在超过一个节点(节点能够运行它可以管理的足够多的容器和一个私有仓库上扩展应用程序,Docker Cloud是有偿服务。这对于实验目的来说足够了。记住,Docker Cloud默认管理托管在第三方托管服务器上的容器,所以你也需要支付费用。使得Docker Cloud代理运行在任何你管理的Linux主机上是可能的,你可以在这里找到操作指南(https://docs.docker.com/docker-cloud/getting-started/use-byon/)。

上面的截图显示了三个使用预先设定的规则运行在跨越两个数字海洋的实例上的Docker容器,这个预先设定的规则是根据你设置的参数来将容器分配给主机。它会自动确保你指定数量的容器始终在运行。

在之前的Docker Compose例子中,你可能已经注意到_ethwe:ipv4_。这是Docker Cloud的另外一个重要特征。许多分布式应用和服务依赖“服务发现”来找到同一服务的其他实例并进行通信。当在数据中心和物理机器上传播服务时,这往往需要实例的手动说明或者需要另一种方式来找到彼此。

Docker Cloud包括支持Weave在你的实际网络中创建一个“软”网络;所有的容器和应用都可以发现彼此,无论它们被托管在哪里。在上面的例子中,我们重写了向容器发出的默认命令,以确保它接收它需要使用此功能的信息。

Data Center

到目前为止,本文涉及的大部分工具都是你安装,主机,和支持的工具。对企业用户来说,他们寻找安全性、性能和支持较高的保证,Docker提供了数据中心。

它使用了覆盖这里的许多相同的工具包,但是增加了一个放置你的镜像的私有仓库,一个私有云,高级支持,和供应商可能吸引企业用户的第三方集成。这些包括LDAP and Active Directory用户管理,容器检测,和日志记录。

总结

正如你从我的截图和你的实验中看到的这些工具,它们仍然感觉像是一套有关系但却松散耦合的产品,而不是一个紧密结合的“套件”。Orca项目似乎试图把重点放在建立所有这些项目之间的一致性上,使每一个项目都成为下一个项目的逻辑铺垫,而且所有这些项目都来自于同一个GUI或者CLI。其目的不仅仅是回答“为什么我应该使用Docker?”,而是回答“为什么我不使用Docker呢?”

Docker的这些工具仍然感觉像是一组松散耦合的产品,而不是一个紧密结合的套件。

欢迎加入本站公开兴趣群

软件开发技术群

兴趣范围包括:Java,C/C++,Python,PHP,Ruby,shell等各种语言开发经验交流,各种框架使用,外包项目机会,学习、培训、跳槽等交流

QQ群:26931708

Hadoop源代码研究群

兴趣范围包括:Hadoop源代码解读,改进,优化,分布式系统场景定制,与Hadoop有关的各种开源项目,总之就是玩转Hadoop

QQ群:288410967

;