【容器编排】是 Docker 生态中的关键概念。当你最初接触 Docker 时,管理单个容器似乎并不复杂。但当你开始配置网络,就会发现将所有服务塞入同一容器并非明智之举。随着时间推移,你逐渐转向多容器架构。起初两三个容器尚可手动管理,但容器数量增多后,手动连接、挂载卷、管理网络就变得令人头疼。这时,你需要一个更高效的容器管理工具来简化工作。
Fig 简介
这个更实用的 Docker 容器编排工具就是 Fig。它最初由 Orchard 公司开发,迅速成为自动化 Docker 容器编排领域的事实标准。如今,Fig 团队已被 Docker 公司收购,成为官方支持的容器编排解决方案。
安装 Fig
安装 Fig 非常简便,只需一条命令即可完成:
$ sudo pip install -U fig
如果执行上述命令遇到问题,建议查阅 Fig 官方文档以获取常见问题的解决方案。
使用 Fig
使用 Fig 进行容器编排的核心是编写一个 YAML 配置文件。其语法直观易懂,与 Docker 命令风格相似。下面是一个具体示例——Pagekit CMS 的 Fig 配置:
web:
image: ubermuda/pagekit
ports:
- 80
links:
- db:pagekit_db_1
volumes_from:
- data
db:
image: orchardup/mysql
environment:
MYSQL_ROOT_PASSWORD: changethis
MYSQL_DATABASE: pagekit
data:
image: busybox
command: /bin/true
volumes:
- /pagekit/storage
- /pagekit/app/cache
这个 YAML 配置文件定义了三种不同类型的容器:
web 容器:基于 ubermuda/pagekit 镜像,暴露 80 端口,通过别名 pagekit_db_1 与 db 容器建立链接,并挂载 data 容器的数据卷。
db 容器:这里展示了在容器中定义环境变量的便捷方式——直接使用 environment 参数即可。你甚至可以只写变量名而不赋值,这样 Fig 会自动从宿主机对应环境变量中读取。例如:
db:
environment:
MYSQL_ROOT_PASSWORD
data 容器:通过 volumes 参数指定需要共享的容器目录。该容器执行的命令是 /bin/true,主要作为数据卷提供者,不运行其他服务。
配置文件编写完成后,只需一条命令即可启动整个容器基础设施:
$ fig up
执行 fig up 后,控制台将显示类似如下的输出日志:
Creating dockerpagekit_db_1...
...
Creating dockerpagekit_data_1...
Creating dockerpagekit_web_1...
...
Attaching to dockerpagekit_db_1, dockerpagekit_web_1
...
db_1 | 141110 4:14:02 [Note] /usr/sbin/mysqld: ready for connections.
db_1 | Version: '5.5.38-0ubuntu0.12.04.1-log' socket: '/var/run/mysqld/mysqld.sock' port: 3306 (Ubuntu)
...
web_1 | 2014-11-10 04:15:20,750 INFO success: nginx entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
web_1 | 2014-11-10 04:15:20,750 INFO success: php5-fpm entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
从日志可以看到,Fig 成功创建了三个容器,其中 dockerpagekit_db_1 与 dockerpagekit_web_1 建立了连接,这正是我们期望的架构。data 容器由于执行的是 /bin/true 命令,因此日志中不会显示其输出。启动完毕后,可以另开一个终端,使用 docker ps 命令确认所有容器均已正常运行。若要验证 web 容器是否对外服务,通过浏览器访问即可(先用 docker ps 或 docker port 查找映射端口)。
但需要注意的是,截至当前版本,Fig 尚不支持远程编排功能,这意味着你只能在单台主机上完成整个容器基础设施的编排。
