0
点赞
收藏
分享

微信扫一扫

不会容器编排?带你使用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链接

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

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

三、Docker Compose的安装

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

Linux下的安装(pip工具安装)


  • 目前Docker Compose只能安装在64位的Linux上
  • 第一步:可安装Pip工具

sudo apt install python-pip

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

  • 第二步:然使用Pip安装Docker Compose
sudo pip install -U docker-compose

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

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

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

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

Linux下的安装(二进制安装)

  • 步骤如下:
wget https://github.com/docker/compose/releases/download/1.27.4/docker-compose-Linux-x86_64

sudo cp -arf docker-compose-Linux-x86_64 /usr/bin/docker-compose

sudo chmod +x /usr/bin/docker-compose
  • 删除如下:
sudo rm /usr/bin/docker-compose

OS X下的安装


  • 如果OS X已经下载了Docker Toolbox,那么Docker Toolbox已经包含了Docker Compose
  • 如果没有下载Docker Toolbox,那么可以像上面Linux一样安装,步骤都是一样的

Windows下的安装

  • 如果Windows已经下载了Docker Toolbox,那么Docker Toolbox已经包含了Docker Compose
  • 当然安装Docker Compose的方法很多,可以自行百度

四、编写测试用例

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

  • 应用容器:运行Python示例程序
  • Redis容器:运行Redis数据库

创建包含Python应用的容器

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

cd composeapp

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

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

  • 这个简单的Flask应用程序追踪保存在Redis里的计数器
  • 每次访问根路径/时,计数器会自增

vim app.py
from flask import Flask
from redis import Redis
import os

app = Flask(__name__)
redis = Redis(host="redis", port=6379)

@app.route('/')
def hello():
redis.incr('hits')
return 'Hello Docker Book reader! I have been seen {0} times'.format(redis.get('hits'))

if __name__ == "__main__":
app.run(host="0.0.0.0", debug=True)

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

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

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

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

  • FROM指令:基于Python 2.7镜像构建
  • LABEL指令:镜像的元数据,此处随意设置
  • ENV指令:与Dockerfile有有关
  • ADD指令:将宿主机当前路径下的app.py和requirements.txt文件加入到镜像的/composeapp目录下
  • WORKDIR指令:将镜像的/composeapp目录设置为工作目录
  • RUN指令:执行pip命令来安装应用的依赖:flask和redis

vim Dockerfile
FROM python:2.7
LABEL maintainer="https://blog.csdn.net/qq_41453285/"
ENV REFRESHED_AT 2020-07-27

ADD . /composeapp

WORKDIR /composeapp

RUN pip install -r requirements.txt

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

  • 第五步:基于上面的Dockerfile创建镜像,镜像的名字为“dongshao/composeapp”
sudo docker build -t dongshao/composeapp .

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

  • 第六步:查看新创建的镜像
sudo docker images

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


  • 现在我们有一个镜像了,这个镜像包含了实例应用和应用需要的依赖,下面我们可以使用Docker Compose来部署应用了
  • 之后会从Docker Hub上的默认Redis镜像直接创建Redis容器,这样就不需要重新构建或者定制Redis容器了

编写docker-compose.yml文件


  • 上面我们的镜像已经创建好了,现在可以配置Compose来创建需要的服务了
  • Docker Compose运行的原理大致如下:

  • 在Compose中,我们定义了一组要启动的服务(以Docker容器的形式表现),我们还定义了我们希望这些服务要启动的运行时的属性,这些属性和docker run命令需要的参数类似
  • 将所有与服务有关的属性都定义在一个YAML文件里
  • 之后执行docker-compose up命令,Compose会启动这些容器,使用指定的参数来执行,并将所有的日志输出合并到一起

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

vim docker-compose.yml
version: '3'
services:
web:
image: jamtur01/composeapp
command: python app.py
ports:
- "5000:5000"
volumes:
- .:/composeapp
links:
- redis
redis:
image: redis

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

docker-compose.yml解析


  • 整个文件使用了一个YAML的散列键定义:web和redis
  • 对于web服务,指定了一些运行时参数:

  • image:指定了要使用的镜像(jamtur01/composeapp)
  • command:指定服务启动时要执行的命令,此处我们为启动app.py程序
  • ports:指定了运行容器时,宿主机与容器之间的端口映射,此处我们把宿主机的5000端口映射到容器的5000端口上
  • volumes:创建容器的卷,此处容器的/composeapp目录挂载到了宿主机的当前路径.下

  • 对于Redis服务:比较简单,直接让其运行一个redis容器,该容器运行时没有指定任何配置,因为这个镜像会默认在标准端口上启动一个Redis数据库
  • 上面的web服务相关参数就像相当于执行了下面的命令:

sudo docker run -d -p 5000:5000 -v .:/composeapp --link redis:redis --name jamtur01/composeapp python app.py
  • 上面的Redis服务相关参数就像相当于执行了下面的命令:
sudo docker run redis
  • 可以在Docker Compose官网查看docker-compose.yml所有可用的指令列表:​​https://docs.docker.com/compose/yml​​ 

运行Compose


  • 上面我们已经编写好了docker-compose.yml文件,并且在其中指定了服务,现在可以来执行这些服务了
  • 在上面我们的composeapp目录下输入下面的命令即可

sudo docker-compose up

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

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


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

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

  • 由于我们的服务是在前台运行的,因此每个服务的日志都会输出:
  • 输出的日志每一行都是用缩短的服务名字作为前缀,并交替输出在一起

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


  • 页面显示了当前计数器的值
  • 如果你刷新网页,那么这个计数器的值会增加,每次刷新都增加保存在Redis里的值
  • Redis更新是通过由Compose控制的Docker容器之间的链接实现的

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

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

备注:-d选项


  • 上面我们启动服务时,没有指定-d选项,服务和Compose的信息都显示在了前台
  • 你可以输出Ctrl+C来停止运行Compose运行,但是由于Redis等服务和Compose交替运行,所以如果你输入Ctrl+C,那么Redis服务也停止了
  • 所以你可以在启动服务的时候使用-d选项,让Compose以守护进程的方式在后台运行

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

五、Compose的其它命令

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

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

help选项

  • compose通过了很多命令,可以使用help命令来查看帮助文档
# 查看所有的帮助 
sudo docker-compose help

# 查看单个命令的帮助, 例如查看ps命令的
sudo docker-compose help ps

up/down选项


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

up -d选项

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

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

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

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

port


  • 打印某个容器端⼝所映射的公共端⼝
  • 选项:

  • --protocol=proto 指定端⼝协议,tcp(默认值)或者 udp
  • --index=index 如果同⼀服务存在多个容器,指定命令对象容器的序号(默认为 1)。


exec选项

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

images

  • 列出Compose⽂件中包含的镜像

ps选项


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

sudo docker-compose ps

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

logs选项


  • 功能:可以查看服务的日志事件
  • 例如,下面查看Compose服务的日志:

sudo docker-compose logs

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

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

pause

  • 暂停⼀个服务容器

stop/start/restart选项


  • stop命令:用来停止compose服务
  • start命令:用来启动compose服务
  • restart命令:重启compose服务
  • 演示案例:下面我们尝试停止运行的compose服务,停止之后再去查看可以看到任务停止了

sudo docker-compose stop

sudo docker-compose ps

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

kill选项

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

rm选项


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

sudo docker-compose rm

sudo docker-compose ps

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

六、总结


  • 本文我们使用一个文件就可以构建一个简单的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)_python_22


举报

相关推荐

0 条评论