Fork me on GitHub

Docker-Compose 实践

为什么需要 Compose?

举个例子,比如我们想在本地搭建一套 PHP的开发环境,并且想搭建一个基于docker容器的开发环境,一个传统的推荐做法是每个web组件自己单独使用一个容器,比如MySQL单独开一个容器,Nginx+PHP开一个容器,缓存Redis单独开一个容器,Memcached再开一个容器,每次启动开发环境,都要手动去启动每个容器,docker run的命令后面外加一串长长的参数,每次都要异常繁琐的方式进行。

Compose就是来解决这个问题的,它使用一个单独的docker-compose.yml文件来管理上面的各个容器,在这个文件中定义了要启动哪些容器,启动参数也配置在文件中,通过这种方式,就实现了一个命令启动所有容器,并且配置好了所有的启动参数,甚至还包括负载均衡容器等。这种实现方式官方称之为容器编排技术,通过docker-compose来实现的容器编排技术。

总结:
Compose实现了对 Docker 容器集群的快速编排(管理多个容器),简化了容器的启动和配置。

安装 Compose

Mac系统下直接安装Docker for Mac,自带docker-compose,安装 Docker 之后可以直接使用。

1
2
3
docker-compose --version

docker-compose version 1.17.1, build 6d101fb


要使用Compose成功的启动多个容器需要两个步骤:

  1. 编写好docker-compose.yml模版文件。
  2. 在该目录下运行docker-compose up命令,一键启动多个容器。
    就是这么简单。
    首先第一步,我们来看看如何配置docker-compose.yml文件。

配置docker-compose.yml 文件

一个最简单的docker-compose.yml长如下这样。

1
2
3
4
5
6
7
8
version: '3'
services:
web:
build: .
ports:
- "5001:5000"
redis:
image: redis

version:指明该文件的版本是3,不同的版本会对应不同版本的 docker引擎,不同版本的文件能使用的指令还不一样,高版本的命令会多一些,类似于函数的API版本。
services:定义多个服务,每个服务对应一个容器,服务名称是自定义的,比如webredis
build:指定 Dockerfile 所在文件夹的路径(可以是绝对路径,或者相对 docker-compose.yml文件的路径)。 Compose 将会利用它自动构建这个镜像,然后使用这个镜像。
ports:和宿主机的映射端口号,格式为宿主机端口 :容器端口,把容器的5000端口映射到本机的5001端口上。
image:指定为镜像名称或镜像 ID。如果镜像在本地不存在,Compose 将会尝试拉取这个镜像。

version:3版本所有命令在这里

实例

这里以启动多个redis容器来作为例子,docker-compose.yml文件为:

1
2
3
4
5
6
7
8
9
10
version: '3'
services:
redis-slave1:
image: redis
ports:
- "6380:6379"
redis-slave2:
image: redis
ports:
- "6381:6379"

端口分别映射到主机端口的63818380.

在当前目录下执行docker-compose up,两个容器分别启动