Docker Compose
Docker Compose:多容器应用的一站式管理工具
在微服务架构中,一个应用往往由多个容器(如 Web 服务、数据库、缓存等)组成,手动管理这些容器的启动、网络配置和依赖关系极为繁琐。Docker Compose 作为 Docker 官方的多容器管理工具,通过一个配置文件(docker-compose.yml)定义所有服务,再通过简单命令实现容器的批量创建、启动、停止等操作,大幅简化了多容器应用的部署流程。
Docker Compose 核心功能
Docker Compose 的核心价值在于简化多容器协同管理,主要功能包括:
- 通过单一配置文件定义所有服务的参数(镜像、端口、网络、数据卷等);
- 一键创建 / 启动所有服务(自动处理容器依赖和网络连接);
- 统一管理容器的生命周期(启动、停止、重启、删除等);
- 支持容器扩缩容、日志查看等运维操作。
常用命令详解
Docker Compose 命令需在 docker-compose.yml 所在目录执行,核心命令如下:
1. 查看版本
docker-compose --version
2. 创建并启动所有服务
前台启动(日志输出到控制台,Ctrl+C停止)
docker-compose up
后台启动(推荐生产环境)
docker-compose up -d
重建镜像并启动(适用于服务配置或Dockerfile修改后)
docker-compose up -d --build
3. 停止并删除容器、网络(保留数据卷)
docker-compose down
4. 启动 / 停止 / 重启服务
启动所有已创建的服务
docker-compose start
停止所有运行中的服务(不删除容器)
docker-compose stop
重启所有服务
docker-compose restart
启动/停止/重启指定服务(如仅操作mysql)
docker-compose start mysql
docker-compose stop mysql
docker-compose restart mysql
5. 查看运行中的容器
docker-compose ps
查看所有服务(包括已停止的)
docker-compose ps -a
6. 查看服务日志
查看所有服务的实时日志
docker-compose logs -f
查看指定服务的日志(如nginx)
docker-compose logs -f nginx
查看最近100行日志
docker-compose logs --tail=100
7. 进入容器内部
docker-compose exec <服务名> <命令>
示例:进入mysql容器的bash终端
docker-compose exec mysql /bin/bash
8. 服务扩缩容
将web服务扩展到3个实例
docker-compose up -d --scale web=3
注意:仅适用于无状态服务,且需确保端口不冲突(避免固定端口映射)。
9. 删除停止的容器
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:定义网络(可选)
用于自定义网络,实现服务间的隔离与通信:
networks:
app-network:
driver: bridge # 桥接网络(默认)
3. volumes:定义数据卷(可选)
用于持久化服务数据,支持命名卷和匿名卷:
volumes:
mysql-data: # 命名卷,可被多个服务共享
redis-data:
完整配置示例
以下是一个包含 Nacos、MySQL、Redis、Nginx 的微服务配置示例:
# 语法版本(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
使用流程
- 编写配置文件:在项目根目录创建
docker-compose.yml,定义所有服务; - 启动服务:执行
docker-compose up -d后台启动所有服务; - 查看状态:通过
docker-compose ps确认服务是否正常运行; - 运维操作:如需修改配置,更新
docker-compose.yml后执行docker-compose up -d热更新; - 停止服务:执行
docker-compose down停止并清理容器(数据卷保留)。
优势与适用场景
优势
- 简化配置:一个文件管理所有服务,避免手动执行大量
docker命令; - 环境一致:确保开发、测试、生产环境的配置统一,减少 “环境差异” 问题;
- 依赖管理:自动处理服务启动顺序(通过
depends_on); - 易于扩展:支持服务扩缩容和动态更新。
适用场景
- 本地开发环境:快速搭建多组件依赖的开发环境(如 Web+DB+Cache);
- 小规模部署:单机或少量服务器的应用部署;
- CI/CD 集成:与 Jenkins 等工具结合,实现自动化部署。
总结
Docker Compose 是多容器应用的 “瑞士军刀”,通过 docker-compose.yml 配置文件和简洁命令,实现了服务的一站式管理。其核心价值在于降低多容器协同的复杂度,让开发者和运维人员能更专注于业务逻辑而非容器操作