为什么需要 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
3docker-compose --version
docker-compose version 1.17.1, build 6d101fb
要使用Compose
成功的启动多个容器需要两个步骤:
- 编写好
docker-compose.yml
模版文件。 - 在该目录下运行
docker-compose up
命令,一键启动多个容器。
就是这么简单。
首先第一步,我们来看看如何配置docker-compose.yml
文件。
配置docker-compose.yml 文件
一个最简单的docker-compose.yml
长如下这样。1
2
3
4
5
6
7
8version: '3'
services:
web:
build: .
ports:
- "5001:5000"
redis:
image: redis
version
:指明该文件的版本是3
,不同的版本会对应不同版本的docker
引擎,不同版本的文件能使用的指令还不一样,高版本的命令会多一些,类似于函数的API
版本。services
:定义多个服务,每个服务对应一个容器,服务名称是自定义的,比如web
和redis
。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
10version: '3'
services:
redis-slave1:
image: redis
ports:
- "6380:6379"
redis-slave2:
image: redis
ports:
- "6381:6379"
端口分别映射到主机端口的
6381
和8380
.
在当前目录下执行docker-compose up
,两个容器分别启动