0%

Docker Compose

Docker Compose:多容器应用的一站式管理工具

在微服务架构中,一个应用往往由多个容器(如 Web 服务、数据库、缓存等)组成,手动管理这些容器的启动、网络配置和依赖关系极为繁琐。Docker Compose 作为 Docker 官方的多容器管理工具,通过一个配置文件(docker-compose.yml)定义所有服务,再通过简单命令实现容器的批量创建、启动、停止等操作,大幅简化了多容器应用的部署流程。

Docker Compose 核心功能

Docker Compose 的核心价值在于简化多容器协同管理,主要功能包括:

  • 通过单一配置文件定义所有服务的参数(镜像、端口、网络、数据卷等);
  • 一键创建 / 启动所有服务(自动处理容器依赖和网络连接);
  • 统一管理容器的生命周期(启动、停止、重启、删除等);
  • 支持容器扩缩容、日志查看等运维操作。

常用命令详解

Docker Compose 命令需在 docker-compose.yml 所在目录执行,核心命令如下:

1. 查看版本

1
docker-compose --version

2. 创建并启动所有服务

1
2
3
4
5
6
7
8
# 前台启动(日志输出到控制台,Ctrl+C停止)
docker-compose up

# 后台启动(推荐生产环境)
docker-compose up -d

# 重建镜像并启动(适用于服务配置或Dockerfile修改后)
docker-compose up -d --build

3. 停止并删除容器、网络(保留数据卷)

1
docker-compose down

4. 启动 / 停止 / 重启服务

1
2
3
4
5
6
7
8
9
10
11
12
13
# 启动所有已创建的服务
docker-compose start

# 停止所有运行中的服务(不删除容器)
docker-compose stop

# 重启所有服务
docker-compose restart

# 启动/停止/重启指定服务(如仅操作mysql)
docker-compose start mysql
docker-compose stop mysql
docker-compose restart mysql

5. 查看运行中的容器

1
2
3
4
docker-compose ps

# 查看所有服务(包括已停止的)
docker-compose ps -a

6. 查看服务日志

1
2
3
4
5
6
7
8
# 查看所有服务的实时日志
docker-compose logs -f

# 查看指定服务的日志(如nginx)
docker-compose logs -f nginx

# 查看最近100行日志
docker-compose logs --tail=100

7. 进入容器内部

1
2
3
docker-compose exec <服务名> <命令>
# 示例:进入mysql容器的bash终端
docker-compose exec mysql /bin/bash

8. 服务扩缩容

1
2
# 将web服务扩展到3个实例
docker-compose up -d --scale web=3

注意:仅适用于无状态服务,且需确保端口不冲突(避免固定端口映射)。

9. 删除停止的容器

1
docker-compose rm

docker-compose.yml 配置文件详解

docker-compose.yml 是 Docker Compose 的核心,用于定义所有服务的配置。其结构清晰,支持多版本语法(如 version: '3.8' 为最新稳定版),主要包含 services(服务)、networks(网络)、volumes(数据卷)等顶级节点。

核心配置项说明

1. services:定义服务列表

每个服务对应一个容器,包含镜像、端口、环境变量等配置。

配置项 作用说明 示例
image 指定服务使用的镜像(本地不存在则自动拉取)。 image: mysql:8.0
build 基于 Dockerfile 构建镜像(替代image)。 build: ./mysql(Dockerfile 所在目录)
container_name 指定容器名称(默认自动生成)。 container_name: my-mysql
ports 端口映射(宿主机端口:容器端口)。 - "3306:3306"
volumes 数据卷挂载(持久化数据)。 - ./data:/var/lib/mysql
environment 设置环境变量(键值对或列表形式)。 MYSQL_ROOT_PASSWORD: 123456
env_file 从文件加载环境变量(每行一个KEY=VALUE)。 env_file: .env
depends_on 定义服务依赖(确保被依赖服务先启动)。 depends_on: [mysql, redis]
command 覆盖容器默认启动命令。 command: redis-server --appendonly yes
restart 容器重启策略(如always表示总是重启)。 restart: always
networks 为服务指定网络(默认使用默认网络)。 networks: - app-network
2. networks:定义网络(可选)

用于自定义网络,实现服务间的隔离与通信:

1
2
3
networks:
app-network:
driver: bridge # 桥接网络(默认)
3. volumes:定义数据卷(可选)

用于持久化服务数据,支持命名卷和匿名卷:

1
2
3
volumes:
mysql-data: # 命名卷,可被多个服务共享
redis-data:

完整配置示例

以下是一个包含 Nacos、MySQL、Redis、Nginx 的微服务配置示例:

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
# 语法版本(3.8为最新稳定版)
version: '3.8'

# 定义服务
services:
# Nacos服务
nacos:
container_name: nacos # 容器名
image: study/nacos/nacos-server:2 # 使用的镜像
build:
context: ./nacos # 若需构建镜像,指定Dockerfile目录
environment:
- MODE=standalone # 单机模式
volumes:
- ./nacos/logs/:/home/nacos/logs # 日志持久化
- ./nacos/conf/application.properties:/home/nacos/conf/application.properties # 配置文件映射
ports:
- "8848:8848" # 主端口
- "9848:9848"
- "9849:9849"
depends_on:
- mysql # 依赖mysql,确保mysql先启动
restart: always # 异常退出时自动重启

# MySQL服务
mysql:
container_name: mysql
image: study/mysql:5
build:
context: ./mysql
ports:
- "3306:3306"
volumes:
- ./mysql/conf:/etc/mysql/conf.d # 配置文件
- ./mysql/logs:/logs # 日志
- ./mysql/data:/var/lib/mysql # 数据持久化
command: [ # 覆盖默认启动命令,设置MySQL参数
'mysqld',
'--character-set-server=utf8mb4',
'--collation-server=utf8mb4_unicode_ci',
'--default-time-zone=+8:00'
]
environment:
MYSQL_DATABASE: 'study' # 初始化数据库
MYSQL_ROOT_PASSWORD: password # root密码
restart: always

# Redis服务
redis:
container_name: redis
image: study/redis
build:
context: ./redis
ports:
- "6379:6379"
volumes:
- ./redis/conf/redis.conf:/home/redis/redis.conf # 配置文件
- ./redis/data:/data # 数据持久化
command: redis-server /home/redis/redis.conf # 启动命令
restart: always

# Nginx服务
nginx:
container_name: nginx
image: study/nginx
build:
context: ./nginx
ports:
- "80:80"
volumes:
- ./nginx/html/dist:/home/work/www/study # 前端静态文件
- ./nginx/conf/nginx.conf:/etc/nginx/nginx.conf # 主配置
- ./nginx/logs:/var/log/nginx # 日志
restart: always

使用流程

  1. 编写配置文件:在项目根目录创建 docker-compose.yml,定义所有服务;
  2. 启动服务:执行 docker-compose up -d 后台启动所有服务;
  3. 查看状态:通过 docker-compose ps 确认服务是否正常运行;
  4. 运维操作:如需修改配置,更新 docker-compose.yml 后执行 docker-compose up -d 热更新;
  5. 停止服务:执行 docker-compose down 停止并清理容器(数据卷保留)。

优势与适用场景

优势

  • 简化配置:一个文件管理所有服务,避免手动执行大量 docker 命令;
  • 环境一致:确保开发、测试、生产环境的配置统一,减少 “环境差异” 问题;
  • 依赖管理:自动处理服务启动顺序(通过 depends_on);
  • 易于扩展:支持服务扩缩容和动态更新。

适用场景

  • 本地开发环境:快速搭建多组件依赖的开发环境(如 Web+DB+Cache);
  • 小规模部署:单机或少量服务器的应用部署;
  • CI/CD 集成:与 Jenkins 等工具结合,实现自动化部署。

总结

Docker Compose 是多容器应用的 “瑞士军刀”,通过 docker-compose.yml 配置文件和简洁命令,实现了服务的一站式管理。其核心价值在于降低多容器协同的复杂度,让开发者和运维人员能更专注于业务逻辑而非容器操作

欢迎关注我的其它发布渠道