前言

这次他姥爷补充一下 docker compose 的使用吧,接着普及 docker 基础,上一次没有讲这个工具的使用方式,这个工具还是很实用的,尤其在我们的环境中需要由多个容器组成的时候,多个 docker run,rm,logs 等命令管理起来真的很不方便,所以 docker compose 这个编排工具就诞生了。

总体介绍

docker 使我们能够把应用的各个部分单独打包成不同的 container(如把网站的 apache 放到一个 container,数据库放到另一个 container )来提高可靠性和实现更灵活的配置。然而每次都得打开一堆 container 才能打开一个应用显得并不方便,Docker Compose 就是用来解决这个痛点的。
Docker Compose 定义:定义和运行多个 docker container 的工具。你只需要在一个文件中定义一个多 container 的应用,然后就能通过一条命令来管理这个应用了。
Compose 对于开发环境、演示环境及 CI 环境中相当实用,然而目前官方并不推荐在生产环境中使用它。

使用方式

使用 Compose 主要有 3 步:

  1. 使用 Dockerfile 定义你的应用的环境(一个 Dockerfile 对应一个 container)
  2. 使用 docker-compose.yml 定义你的应用需要用到的服务。
  3. 运行 docker-compose up ,Compose 就会启动你的整个应用及所需要的服务。

docker-compose.yml 大致格式如下(用我们曾经的 CI 环境为例):

simba:
 image: 4paradigm/dango2.0-test-ci-simba
 container_name: ${simba_container_name}
 net: "none"
 volumes:
 - /root/.ssh:/root/.ssh
 environment:
 - mariadb_ip=${mariadb_ip}
 - tm_ip=${tm_ip}
 - local_ip=${simba_ip}
 - simba_branch=${simba_branch}
 links:
 - mariadb
 - tm
mariadb:
 image: mariadb-ci
 container_name: ${mariadb_container_name}
 net: "none"
 environment:
 - MYSQL_ROOT_PASSWORD=paradigm4
tm:
 image: 4paradigm/dango2.0-test-ci-tm
 container_name: ${tm_container_name}
 net: "none"
 volumes:
 - /root/.ssh:/root/.ssh
 links:
 - mariadb
 environment:
 - local_ip=${tm_ip}
 - mariadb_ip=${mariadb_ip}
 - tm_branch=${tm_branch}

可以看到我们是使用 compose 来管理多个容器的。和我们使用 docker run 一样,可以设置数据卷,环境变量,link,容器名称等等。只不过我们把多个容器统一管理了起来,使用 docker-compose 的命令统一管理多个容器。避免了容器很多的时候操作和管理比较麻烦。下面看一下具体的命令的例子。

这是我们的 boot.sh。可以看到我们是用环境变量与 compose 文件沟通的,并且一个 kill 命令可以停止所有定义在 compose 文件中的容器,rm 可以删除所有容器,然后 up 命令就会创建并启动新的容器。不过之后增加了多少个容器,这里都可以用这些命令去管理。唯一不足的地方是如果我们想要指定静态 IP 的话,还是避免不了使用 pipework。看文档上说 compose2.0 版本是可以在 compose 文件中指定 ip 的。不过它依赖于 docker engine 的版本在 1.10 以上。我们的 docker 还是 1.09.所以 compose 很多的功能其实我们都用不了。而升级 1.10 是比较麻烦的,而且不保证升级之后以前的镜像是否可用。
下面我们看一下启动后的效果。通过下图我们可以看到运行的时候会 kill 掉所有容器,然后删除所有容器,再根据镜像重新创建并启动这些容器。

其他常用命令
docker-compose ps 可以查看当前 compose 文件定义的容器都有哪些是启动了

docker-compose logs 可以将所有容器的 log 都定义到输入流中
其他命令:

总结

总的来说其实你不用 docker compose 也不影响使用的,单纯的就用 docker run 也没什么不可以。而实际上我在测试环境中已经不用 docker compose 了。一个 compose.yml 只能管理一个环境。如果管理多个环境,你只能创建多个 yml 文件文件了。我那好几十套环境所以我嫌麻烦就 docker run 跑着,写个脚本参数化一下就好了。 不过如果我们有一些固定的服务是多个容器组成的,docker compose 还是很方便的


↙↙↙阅读原文可查看相关链接,并与作者交流