天天看点

不会容器编排?带你使用Docker容器编排工具Docker Compose(原Fig)

一、Docker编配

编配(orchestration)是一个没有严格定义的概念。这个概念概念大概描述了自动配置、协作和管理服务的过程。在Docker的世界里,编配用来描述一组时间过程,这个过程会管理运行在多个Docker容器里的引用,而这些Docker容器有可能运行在多个宿主机上。Docker对编配的原生支持非常弱,不过整个社区围绕编配开发和集成了很多很棒的工具

在现在的生态环境里,已经围绕Docker构建和继承了很多工具。一些工具只是简单地将多个容器快捷地“连”在一起,使用简单的组合来构建引用程序栈。另外一些工具提供了在更大规模多个Docker宿主机上进行协作的能力,以及复杂的调度和执行能力

本文介绍Docker Compose,Docker Compose(其前身是开源项⽬Fig)是由Orchard团队开发的开源DOcker编配工具,后来2014年被Docker公司收购。这个工具用Python编写,遵循Apache 2.0许可

在后面的文章还会介绍用Consul来做服务发现,以及使用Swarm来做Docker的编配和集群

Compose和Consul不是Docker编配工具这个家族里唯一的选择。编配工具是一个快速发展的生态环境,没有办法列出这个领域中的所有可用的工具,这些工具的功能不尽相同,不过大部分属于以下两个类型:

调度和集群管理

服务发现

下面是一些其他的编配工具和组件

Fleet和etcd:Fleet和etcd由CoreOS团队发布。Fleet是一个集群管理工具,而 etcd是一个高可用性的键值数据库,用于共享配置和服务发现。 Fleet与systemd和etcd一起,为容器提供了集群管理和调度能力。可以把 Fleet看作是systemd的扩展,只是不是工作在主机层面上,而是工作在 集群这个层面上

Kubernetes:Kubernetes是由Google开源的容器集群管理工具。这个工具可以使 用Docker在多个宿主机上分发并扩展应用程序。Kubernetes主要关注需 要使用多个容器的应用程序,如弹性分布式微服务

Apache Mesos:Apache Mesos项目是一个高可用的集群管理工具。Mesos从Mesos 0.20开始,已经内置了Docker集成,允许利用Mesos使用容器。Mesos在 一些创业公司里很流行,如著名的Twitter和AirBnB

Helios:Helios项目由Spotify的团队发布,是一个为了在全流程中发布和管 理容器而设计的Docker编配平台。这个工具可以创建一个抽象的“作 业”(job),之后可以将这个作业发布到一个或者多个运行Docker的 Helios宿主机

Centurion:Centurion是一个基于Docker的部署工具,由New Relic团队打造并开 源。Centurion从Docker Registry里找到容器,并在一组宿主机上使用正 确的环境变量、主机卷映射和端口映射来运行这个容器。这个工具的目 的是帮助开发者利用Docker做持续部署

二、Docker Compose介绍

Compose项⽬是Docker官⽅的开源项⽬,负责实现对Docker容器集群的快速编排。从功能上看,跟OpenStack中的Heat⼗分类似

使用Docker Compose,可以用一个YAML文件定义一组要启动的容器,以及容器运行时的属性。Docker Compose称这些容器为“服务”,定义为:容器通过某些方法并制定一些运行时的属性来和其他容器产生交互

Compose中有两个重要的概念:

服务 ( service ):⼀个应⽤的容器,实际上可以包括若⼲运⾏相同镜像的容器实例

项⽬ ( project ):由⼀组关联的应⽤容器组成的⼀个完整业务单元,在docker-compose.yml⽂件中定义

Compose的默认管理对象是项⽬,通过⼦命令对项⽬中的⼀组容器进⾏便捷地⽣命周期管理

Compose项⽬由Python编写,实现上调⽤了 Docker 服务提供的 API 来对容器进⾏管理。因此,只要所操作的平台⽀持 Docker API,就可以在其上利⽤ Compose 来进⾏编排管理

官方文档:https://docs.docker.com/compose/

开源地址:https://github.com/docker/compose

下载方式1:公众号【多栖技术控小董】回复【3677】获取免费下载链接。

下载方式2:Github链接https://github.com/dongyusheng/csdn-code/tree/master/Docker/composeapp

不会容器编排?带你使用Docker容器编排工具Docker Compose(原Fig)

本文下面介绍如何使用Docker Compose构建一个简单的多容器引用程序栈

三、Docker Compose的安装

目前Docker Compose可以运行在Linux、Windows和OS X上。可以通过直接安装可执行包来安装,或者通过Docker Toolbox安装,也可以通过Python Pip包来安装

目前Docker Compose只能安装在64位的Linux上

第一步:可安装Pip工具

不会容器编排?带你使用Docker容器编排工具Docker Compose(原Fig)

第二步:然使用Pip安装Docker Compose

不会容器编排?带你使用Docker容器编排工具Docker Compose(原Fig)

第三步:然后直接就可以使用这个程序了,例如下面查看docker-compose的版本

不会容器编排?带你使用Docker容器编排工具Docker Compose(原Fig)

运行命令发现会输出警告,可能是因为我系统Python没搞好的原因,下面输入docker-compose命令都会带有,但不影响使用。如果可以,你也可以用下面的使用二进制安装的方法

步骤如下:

删除如下:

如果OS X已经下载了Docker Toolbox,那么Docker Toolbox已经包含了Docker Compose

如果没有下载Docker Toolbox,那么可以像上面Linux一样安装,步骤都是一样的

如果Windows已经下载了Docker Toolbox,那么Docker Toolbox已经包含了Docker Compose

当然安装Docker Compose的方法很多,可以自行百度

四、编写测试用例

下面我们使用一个Python Flask引用作为例子,这个例子使用了以下两个容器:

应用容器:运行Python示例程序

Redis容器:运行Redis数据库

第一步:创建一个composeapp目录,用来存放本文用到的所有文件

不会容器编排?带你使用Docker容器编排工具Docker Compose(原Fig)

第二步:创建引用程序的源代码,名为app.py,代码如下:

这个简单的Flask应用程序追踪保存在Redis里的计数器

每次访问根路径/时,计数器会自增

不会容器编排?带你使用Docker容器编排工具Docker Compose(原Fig)

第三步:创建一个requirements.txt文件来保存应用程序的依赖关系,下面Dockerfile会用到。文件的内容如下:

不会容器编排?带你使用Docker容器编排工具Docker Compose(原Fig)

第四步:创建Dockerfile文件,用于构建镜像,文件的内容如下:

FROM指令:基于Python 2.7镜像构建

LABEL指令:镜像的元数据,此处随意设置

ENV指令:与Dockerfile有有关

ADD指令:将宿主机当前路径下的app.py和requirements.txt文件加入到镜像的/composeapp目录下

WORKDIR指令:将镜像的/composeapp目录设置为工作目录

RUN指令:执行pip命令来安装应用的依赖:flask和redis

不会容器编排?带你使用Docker容器编排工具Docker Compose(原Fig)

第五步:基于上面的Dockerfile创建镜像,镜像的名字为“dongshao/composeapp”

不会容器编排?带你使用Docker容器编排工具Docker Compose(原Fig)

第六步:查看新创建的镜像

不会容器编排?带你使用Docker容器编排工具Docker Compose(原Fig)

现在我们有一个镜像了,这个镜像包含了实例应用和应用需要的依赖,下面我们可以使用Docker Compose来部署应用了

之后会从Docker Hub上的默认Redis镜像直接创建Redis容器,这样就不需要重新构建或者定制Redis容器了

上面我们的镜像已经创建好了,现在可以配置Compose来创建需要的服务了

Docker Compose运行的原理大致如下:

在Compose中,我们定义了一组要启动的服务(以Docker容器的形式表现),我们还定义了我们希望这些服务要启动的运行时的属性,这些属性和docker run命令需要的参数类似

将所有与服务有关的属性都定义在一个YAML文件里

之后执行docker-compose up命令,Compose会启动这些容器,使用指定的参数来执行,并将所有的日志输出合并到一起

创建一个docker-compose.yml文件,内容如下:

不会容器编排?带你使用Docker容器编排工具Docker Compose(原Fig)

整个文件使用了一个YAML的散列键定义:web和redis

对于web服务,指定了一些运行时参数:

image:指定了要使用的镜像(jamtur01/composeapp)

command:指定服务启动时要执行的命令,此处我们为启动app.py程序

ports:指定了运行容器时,宿主机与容器之间的端口映射,此处我们把宿主机的5000端口映射到容器的5000端口上

volumes:创建容器的卷,此处容器的/composeapp目录挂载到了宿主机的当前路径.下

对于Redis服务:比较简单,直接让其运行一个redis容器,该容器运行时没有指定任何配置,因为这个镜像会默认在标准端口上启动一个Redis数据库

上面的web服务相关参数就像相当于执行了下面的命令:

上面的Redis服务相关参数就像相当于执行了下面的命令:

可以在Docker Compose官网查看docker-compose.yml所有可用的指令列表:https://docs.docker.com/compose/yml 

上面我们已经编写好了docker-compose.yml文件,并且在其中指定了服务,现在可以来执行这些服务了

在上面我们的composeapp目录下输入下面的命令即可

不会容器编排?带你使用Docker容器编排工具Docker Compose(原Fig)

上面输出了大量的信息,内容为:

从最前面的信息可以看出,Compose创建了两个新的服务:

composeapp_redis_1、composeapp_web_1

命名是有规范的,为了保证服务的唯一性,Compose将docker-compose.yml文件中指定的服务名字加上了目录名作为前缀,并使用数字作为后缀

由于我们的服务是在前台运行的,因此每个服务的日志都会输出:

输出的日志每一行都是用缩短的服务名字作为前缀,并交替输出在一起

因为我们的Python应用程序是映射到宿主机的5000端口上的,因此我们可以输入下面的URL来访问这个程序:

页面显示了当前计数器的值

如果你刷新网页,那么这个计数器的值会增加,每次刷新都增加保存在Redis里的值

Redis更新是通过由Compose控制的Docker容器之间的链接实现的

不会容器编排?带你使用Docker容器编排工具Docker Compose(原Fig)
不会容器编排?带你使用Docker容器编排工具Docker Compose(原Fig)

上面我们启动服务时,没有指定-d选项,服务和Compose的信息都显示在了前台

你可以输出Ctrl+C来停止运行Compose运行,但是由于Redis等服务和Compose交替运行,所以如果你输入Ctrl+C,那么Redis服务也停止了

所以你可以在启动服务的时候使用-d选项,让Compose以守护进程的方式在后台运行

提示:在默认情况下,Compose会试图连接到本地的Docker守护进程,不过会受到DOCKER_HOST环境变量的影响,去连接一个远程的Docker宿主机 

五、Compose的其它命令

对于Compose来说,⼤部分命令的对象既可以是项⽬本身,也可以指定为项⽬中的服务或者容器。如果没有特别的说明,命令对象将是项⽬,这意味着项⽬中所有的服务都会受到命令影响

不会容器编排?带你使用Docker容器编排工具Docker Compose(原Fig)

compose通过了很多命令,可以使用help命令来查看帮助文档

up选项用来启动容器

down将会停⽌up命令所启动的容器,并移除⽹络

接着上面的演示案例,我们现在按下Ctrl+C来关闭在宿主机前台运行的Compose服务

不会容器编排?带你使用Docker容器编排工具Docker Compose(原Fig)

然后输入下面的命令重新运行这些服务,不过我们指定-d选项,让这些服务以守护进程的方式在后台运行

不会容器编排?带你使用Docker容器编排工具Docker Compose(原Fig)

打印某个容器端⼝所映射的公共端⼝

选项:

--protocol=proto 指定端⼝协议,tcp(默认值)或者 udp

--index=index 如果同⼀服务存在多个容器,指定命令对象容器的序号(默认为 1)。

在运行的容器中执行一个命令

列出Compose⽂件中包含的镜像

功能:该选项可以查看这些服务的运行状态

例如,下面查看我们那两个服务的状态,显示了Compose服务的一些基本信息,例如有:每个服务的名字、启动服务的命令以及每个服务映射到的端口

不会容器编排?带你使用Docker容器编排工具Docker Compose(原Fig)

功能:可以查看服务的日志事件

例如,下面查看Compose服务的日志:

不会容器编排?带你使用Docker容器编排工具Docker Compose(原Fig)

默认情况下,docker-compose 将对不同的服务输出使⽤不同的颜⾊来区分。可以通过 --no-color 来关闭颜⾊

暂停⼀个服务容器

stop命令:用来停止compose服务

start命令:用来启动compose服务

restart命令:重启compose服务

演示案例:下面我们尝试停止运行的compose服务,停止之后再去查看可以看到任务停止了

不会容器编排?带你使用Docker容器编排工具Docker Compose(原Fig)

该命令与stop命令一样,都是用来停止Compose服务的

功能:该功能可以同来删除服务

演示案例:下面来删除创建的两个服务,输入之后会让你输入y或N来选择是否删除。删除之后可以看到服务已经不存在了

不会容器编排?带你使用Docker容器编排工具Docker Compose(原Fig)

六、总结

本文我们使用一个文件就可以构建一个简单的Python-Redis栈了。可以看出这种方法能够非常简单地构建一个需要多个Docker容器的应用程序

而这个例子,只展现了Compose最表层的能力,在Compose官网还有很多更高级的例子,比如使用:

Rails:https://docs.docker.com/compose/rails/)

Django:https://docs.docker.com/compose/django/

Wordpress:https://docs.docker.com/compose/wordpress/

还可以将Compose与提供图形化界面用户的Shipyard一起使用:https://docs.docker.com/compose/cli。

我是小董,V公众点击"笔记白嫖"解锁更多【Docker】资料内容。

不会容器编排?带你使用Docker容器编排工具Docker Compose(原Fig)