本文是一个简短的指南帮助了解Docker周边工具生态系统,以及他们是如何实现的。
只要你出席任何高科技相关的活动,或在过去18个月读取任何科技相关的文章,你就可能听到过Docker,并且了解它是什么以及做什么用。
简而言之,Docker的建立基于过去的一系列概念但是它青出于蓝胜于蓝。Docker是创建“容器”的工具,它可以包容你所需要的一系列离散的应用程序和技术栈。不像虚拟机,这些容器共享相同的资源来管理容器和主机之间的交互。 这使得Docker容器更快,更轻,安全,且资源可共享。
就个人而言,作为一个技术作家和演讲者,我发现Docker在创建演示和演说有无限价值。我可以组建我需要的组件堆栈,运行它们,然后再销毁它们,保持系统干净、整洁没有任何我不再需要的包和数据。
许多开发者在Docker的开发和测试过程中看到了它的明确用例,但是仍然在努力摸索如何最好的应用它到实际的生产中。大量第三方工具和服务正在急速涌现,以帮助开发人员部署、配置和管理他们在实际生产开发中的Docker工作流程。
Docker已通过一系列收购和产品发布构建了自己的“官方”的工具包。Orca项目,就我们已知的,它是在去年美国的DockerCon上面宣布的,虽然细节还是有一点点模糊。在我看来,Orca背后的战略相对而言是Docker不断扩大的产品组合的整合,而不是一个实际的项目或产品。
因此在这篇文章中,我将会展示当前Docker生态系统中已经存在的一部分的总结,以及你能如何使用它们,并且把这些碎片联系到一起。
Docker Hub
一个Dockerfile是任何使用Docker的项目核心。这个文件包含了Docker如何创建镜像的说明。下面就让我们来看一个简单例子:
FROM python:2.7ADD . /code
WORKDIR /code
RUN pip install -r requirements.txt
在这个例子中,Dockerfile pull一个已经存在的镜像的特定版本,拷贝到当前容器文件系统的本地目录。并设置其为工作目录,然后经由pip命令安装一个文本文件定义的Python依赖库。
Docker Hub是预定义的官方的Dockerfiles源,为镜像提供公共(免费)和私立(付费)库。如果你正在寻找一个满足你需求的Dockerfile,首先搜索Docker Hub,使用项目文档,下载量,和评价星级,以帮助指导你的决定。
Docker Engine
Docker Engine用于建立Dockerfiles并且把它转化为可运行的容器。Engine是Docker的核心,没有任何其他功能能脱离它而运行。基于不同的操作系统,我们有很多不同选项来安装Docker Engine,更多这方面材料可以参见链接。
要启动一个基于Docker Hub镜像的容器,pull它的镜像并运行它。然后启动一个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
这个例子pull最新版本的Python镜像并且启动容器来执行一个Python脚本然后结束退出。当然,这里我们还可以有很多其他的选项,并且使用run命令来跑更多的应用,你可以以下链接中读到完整的教程。
当Docker的run命令变的越来越复杂的时候,这时或许更适合开始创建你的定制化Dockerfile。要启动基于本地化Dockerfile的一个容器,并且执行目录中的某个文件操作如下:
docker build -t my_image .
上述命令会创建一个名为my_image的镜像,执行基于这个镜像的容器命令如下:
docker run -name my_image_container -i -t my_image
上述命令启动一个名为my_image_container 基于my_image的镜像。
Kitematic
对于那些希望避免使用命令行的人来说,Kitematic是Mac OS X和Windows一个非常好的GUI工具。 搜索你需要的镜像,创建相应容器,就这么简单。Kitematic提供了基本的配置选项,但对于更高级的设置,你可能还是需要深入命令行。
你的容器出现在界面左边,在那里它们可以被启动、停止、重新启动,其中最有用的是你可以找到容器日志和直接SSH(点击EXEC按钮)访问。
Docker Machine and Swarm
对在生产中使用Docker的第一步是了解Machine 和Swarm,它们提供了一系列简单的工具集用于迁移和缩放你的本地项目用于各种虚拟化和云提供商。
例如,创建在Azure上一个Docker的实例:
docker-machine create -d azure --azure-subscription-id="XXX" --azure-subscription-cert="/mycert.pem" ecodemo
此命令创建一个基于12.04Ubuntu名为ecodemo的VM以及Docker预装。不同供应商需要不同的参数和认证方法,并且默认配置可以被覆盖。这里可以阅读更详细的文档。
当结合Swarm使用时,Machine可以创建一组实例集群被视为单一的、大型的Docker实例。每个Swarm群集需要一个主实例,它是使用下面的命令创建:
docker-machine create
-d virtualbox --swarm --swarm-master --swarm-discovery token://TOKEN_ID swarm-master
这在VirtualBox中创建一个Docker实例,并将它作为一个群集的主节点。该TOKEN_ID很重要,因为它有助于在一个集群中的所有节点之间相互识别。除了手动创建一个token之外,我们有个discovery systems可以帮助管理这一过程。
添加Docker实例的群集,并使用相同TOKEN_ID如下:
docker-machine create
-d virtualbox --swarm --swarm-discovery token://TOKEN_ID swarm-node-n
swarm-node-n在群集中对于每个节点都是独一无二的。
现在你不仅仅可以在独立的VM中启动容器,你也可以开始在群集中启动容器,并且主节点会分配在最可用和可有能力的节点上。
Docker Compose
Compose 的目的在于使装配包含多个组件(以及其容器)的应用程序更加简便;你可以定义所有这一切在一个配置文件中,并简单一句命令来启动这个文件。
以下是一个Compose文件的示例(名为docker-compose.yml),它创建了三个Crate数据库实例以及一个PHP framework Laravel(包含部分额外的配置)的实例。关键的是,容器将自动链接到links配置选项。
crate1:
image: crate
ports:
- "4200:4200" - "4300:4300"crate2:
image: crate
crate3:
image: crate
volumes:
- ./data:/importdatalaravelcomposer:
image: dylanlindgren/docker-laravel-composer
volumes:
- /laravel-application:/var/www command: --working-dir=/var/www install
links:
- crate1laravelartisan:
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文件来设置应用程序栈,所以它不再是生态系统中一个大的阻碍。
例如:
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管理的容器需要托管于第三方服务,所以这里也是需要成本的。你可以在任何Linux主机上运行Docker Cloud agent,更多详细说明如下链接。
上面的截图显示了跨越两个数字海洋的三个运行中Docker容器实例,它们使用基于你配置参数的预定义规则来分配容器到相应主机上。它会自动确保指定数量的容器始终运行。
在Docker早些时候Compose的例子中,你可能已经注意到ethwe:ipv4 。 这是Docker Cloud的另一个非常有用的功能。许多分布式应用程序和服务都依赖于“ Service Discovery ”找到相同服务的其他实例来交流。 当服务分散在数据中心和物理机上时,这里通常需要实例通过手动声明或者它们就需要另一种方式来找到对方。
Docker Cloud包括支持Weave来建立跨越物理网络的“软”网络;所有容器和应用程序都可以发现彼此,无论它们被托管在何处。 在上面的例子中,我们修改了容器的默认命令参数,以确保它接收到它需要使用此功能时的信息。
Data Center(数据中心)
至此,大部分本文章介绍过的工具都是在本地由你自己安装,托管,和支持。对于企业用户来说,他们需要寻找更高的服务质量担保,包括安全,性能和支持。Docker也提供Data Center。
它采用的大多是在这里已经涉及的同类工具,但为你的镜像添加了一个私有仓库,一个有高级支持的私有云,并提供第三方集成的供应商来吸引企业用户。这些措施包括使用LDAP和Active Directory的用户管理,容器监控和日志。
结论
正如你会从我的上述截图和你自己使用这些工具的体验来看,它们仍然像是一系列相互联系,但松散耦合的产品,而不是一个有凝聚力的“套件”。项目Orca似乎试图把重点放在建立所有这些项目之间的一致性,使每个产品都是彼此逻辑上的一环,都来自同一个GUI或CLI。它的目的不仅仅是回答“我为什么要使用Docker?”,还有“我为什么不使用Docker?”。