〖Docker 指南⑦〗docker-compose 快速入门
一、简介
由 Docker 引领先锋,容器在过去的一年里得到了飞速发展。容器技术提供了组件化环境,帮助应用在云之间轻松迁移而无需显著的返工。当谈到构建云以及非云的应用时,容器的战斗口号是可移植性和简单性。
随着容器在企业持续获得发展,厂商将增加新的功能让用户可以创建可扩展的基于容器的环境,这些功能很大程度上都集中于容器编排上。
容器编排工具提供调度和集群的技术,提供用于基于容器应用可扩展性的基本机制。这些工具使用容器服务,并编排他们以决定容器之间如何进行交互。此外,编排允许容器可以存在并执行在集群上,这使得他们能够扩展来适应增加的处理负荷。
docker-compose 是 docker 官方提供的容器编排工具,但市面上使用得较多的容器编排工具是 k8s。什么是容器编排?容器编排就是管理宿主机部署容器的过程。docker-compose 只支持单机多容器部署,通过 yml 文件配置你自己的服务,然后通过一个命令,你能使用配置文件创建和运行所有的服务,重点可以启动多个容器!!!
二、安装
2.1 版本选择
我们所选择的 docker-compose 版本要和 docker engine 版本对应:友情链接
在这里插入图片描述
2.2 下载
在 Linux 系统上将 Compose 安装为独立的二进制文件
运行以下命令下载 Docker Compose 的当前稳定版本:
curl -SL https://github.com/docker/compose/releases/download/v2.5.0/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
对二进制文件应用可执行权限:
chmod +x /usr/local/bin/docker-compose
测试安装:
docker-compose --version
在这里插入图片描述
三、原理
Compose 项目是由 Python 编写的,实际上就是调用了 Docker 服务提供的 API 来对容器进行管理,因此,只要所在的操作系统的平台支持 Docker API,就可以在其上利用 Compose 来进行编排管理。
compose 中常常提及的概念:
project
通过 docker compose 管理的一个项目被抽象称为一个 project,它是由一组关联的应用容器组成的一个完整的业务单元。简单点说就是一个 docker-compose.yml 文件定义一个 project。我们可以在执行 docker-compose 命令时通过 -p 选项指定 project 的名称,如果不指定,则默认是 docker-compose.yml 文件所在的目录名称。
service
运行一个应用的容器,实际上可以是一个或多个运行相同镜像的容器。可以通过 docker-compose up 命令的 --scale 选项指定某个 service 运行的容器个数,比如:
docker-compose up -d --scale redis=2
了解了上面的基本概念之后,让我们一起看看 compose 的一次调用流程:
在这里插入图片描述
右上角的 docker-compose 定义了一组 service 来组成一个 project,通过 docker-compose.yml 中 service 的定义与 container 建立关系(service 与容器的对应关系),最后使用 container 来完成对 docker-py(Python 版的 docker client) 的调用,向 docker daemon 发起 http 请求。
注意,这里的 project, service 和 container 对应的都是 docker-compose 实现中的数据结构。下面让我们结合上图来介绍 docker-compose 工作的大致流程。
首先,用户执行的 docker-compose up 命令调用了命令行中的启动方法,功能非常简单。一个 docker-compose.yml 文件定义了一个 project,docker-compose up 提供的命令行参数则作为这个 project 的启动参数交由 project 模块处理。
然后,如果当前宿主机已经存在与该应用对应的容器,docker-compose 则进行行为逻辑判断。如果用户指定可以重新启动已有服务,docker-compose 就会执行 service 模块的容器重启方法,否则就直接启动已有容器。这两种操作的区别在于前者会停止旧的容器,创建并启动新的容器,并把旧容器移除掉。在这个过程中创建容器的各项自定义参数都是从 docker-compose up 命令和 docker-compose.yml 中传入的。
接下来,启动容器的方法也很简洁,这个方法中完成了一个 docker 容器启动所需的主要参数的封装,并在 container 模块执行启动。
最后,contaier 模块会调用 docker-py 客户端来执行向 docker daemon 发起创建容器的 POST 请求。
由此可见 docker-compose 工作的整体流程非常清晰、简洁!
重新启动 services
前面我们提到当前宿主机已经存在与该应用对应的容器,docker-compose 会进行判断并决定是否重新启动已有服务。
强制 recreate
Recreate 就是删除现有的容器并且重新创建新的容器,为 docker-compose up 命令指定 --force-recreate 选项可以强制 recreate 容器。
创建个别容器
如果应用中的个别 service 对应的容器被删除了,docker-compose up 命令会新建相关的容器。
启动个别容器
与上面类似,如果应用中的个别 service 对应的容器被停止(stop)了,docker-compose up 命令会重新启动相关的容器。
四、常用命令
Compose 大部分命令的对象即可以是项目的本身,也可以是指定为项目中的服务或者容器执行docker-compose [COMMAND] --help
或者docker-compose help [COMMAND]
可以查看命令的帮助信息
具体的使用格式docker-compose [-f=<arg>...] [options] [COMMAND] [ARGS]
参数选项
Compose 所支持的命令
五、实战
编写docker-compose.yml
修改项目中的相关配置文件
执行配置文件检查
在这里插入图片描述
有问题修改,没问题执行 yml 文件docker-compose up -d
此时查看我们的 docker 网络docker network ls
会发现我们的自定义的网络名字ossa_net
变成了docker-compose-test_ossa_net
「对于网络名称,会在自定的网络前加上
当前文件夹名字
+_
,对于没有指定容器名字的服务,会在服务的前面加上当前文件夹名字
+_
,在后面加上数字1
,如存在 1,则递增」
最后,停止服务docker-compose stop
文献参考:徐珉. Docker 环境下容器编排工具的选择. 《 集成电路应用 》 , 2017
版权声明: 本文为 InfoQ 作者【步尔斯特】的原创文章。
原文链接:【http://xie.infoq.cn/article/8bb8f0a775cae4f2e20b305c7】。文章转载请联系作者。
评论