Docker-Compose 是一个容器编排工具,需要结合 Docker 使用,通过编辑 yaml 文件将所有的容器的部署方法、文件映射、容器端口映射等情况进行提前设置,然后执行 docker-compose up 命令进行快速部署。

入门

安装

选择合适的版本 - https://github.com/docker/compose

1
2
3
4
5
6
#下载最新版的 docker-compose 文件
curl -L https://github.com/docker/compose/releases/download/v2.6.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
#添加可执行权限
chmod +x /usr/local/bin/docker-compose
#测试安装结果
docker-compose -v

命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#停止运行并移除容器
docker-compose down
#启动单个服务
docker-compose up -d 服务名
#查看当前运行的服务
docker-compose ps
#构建镜像,--no-cache 表示不用缓存
docker-compose build --no-cache
#查看镜像
docker-compose images
#查看日志
docker-compose logs
#启动/停止服务
docker-compose start/stop 服务名
#拉取镜像
docker-compose pull 镜像名

编排

文件

Docker-Compose 最重要的时 yaml 文件的结构和语法,更多内容见《官方文档

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
vi docker-compose.yml

version: "3.9" #语法格式版本
services: #定义服务
web: #服务名称
build: . #指定 Dockerfile 路径
ports: #端口
- "8080:5000" #主机端口:容器端口
volumes:
- .:/code
- logvolume01:/var/log
links:
- redis
redis:
image: redis
volumes:
logvolume01: {}

实例

部署 Node.js、PHP、MySQL、Redis、RabbitMQ 前后端分离项目

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
version: '3' #语法格式版本
services: #定义服务
backend: #服务名称
build: #Dockerfile 路径,可以是相对/绝对路径
context: backend #Dockerfile 名称
dockerfile: Dockerfile
volumes: #相当于 docker run -v
- "./backend:/opt/www" #主机路径:容器路径
command: [ #相当于 Dockfile 中的 CMD 且优先级更高
"php",
"/opt/www/server.php"
]
container_name: backend-compose #容器名称
depends_on: #该服务依赖的其他服务,可修改启动顺序
- mysql
- redis
- rabbitmq
ports: #映射端口
- "9502:9502" #主机端口:容器端口

frontend:
build:
context: frontend
dockerfile: Dockerfile
ports:
- "3000:3000"
container_name: frontend-compose

mysql:
build:
context: mysql
dockerfile: Dockerfile
ports:
- "3306:3306"
environment: #相当于 docker run -e
MYSQL_ROOT_PASSWORD: root@123 #初始化的数据库密码
MYSQL_DATABASE: junyu #初始化的数据库名称
container_name: mysql-compose
restart: always #自动重启
volumes:
- "./mysql/db/:/var/lib/mysql"
command: [ #相当于 Dockfile 中的 CMD 且优先级更高
"mysqld",
"--lower_case_table_names=1", #设置表名不区分大小写
"--default-authentication-plugin=mysql_native_password", #设置密码认证插件,低于 8.0.4 版本忽略
"--character-set-server=utf8mb4",
"--collation-server=utf8mb4_general_ci",
"--max_connections=3000" #设置最大连接数
]

redis:
image: redis
ports:
- "6379:6379"
container_name: redis-compose
restart: always
command: [
"redis-server",
"--requirepass 123456", #设置密码为:123456
"--appendonly yes" #开启持久化
]

rabbitmq:
image: rabbitmq:management
ports:
- "5672:5672"
- "15672:15672"
container_name: rabbitmq-compose
environment:
RABBITMQ_DEFAULT_USER: admin #rabbitmq 的初始用户名
RABBITMQ_DEFAULT_PASS: 123456 #rabbitmq 的初始密码

networks:
default:
external:
name: appnet
#指定使用的网络,要提前创建好
#docker network create --driver bridge --subnet 172.16.0.0/16 appnet
#--driver/-d 指定连接方式,--subnet 指定网段 ,appnet 为网络名称
#使用新的指定网络是为了防止网段占用完,route -n 查看网段占用情况

故障

Docker-Compose 配置容器启动顺序,有时依靠 depends_on 并不能完全解决,因为 depends_on 只能保证容器进入了 running 状态而不保证是否进入 ready 状态
解决方案:启动命令前增加判断依赖服务状态的工具
https://www.runoob.com/docker/docker-compose.html