Docker Compose 实战教程
在容器化已成主流的今天,大部分人可能已经熟悉 Docker,但当需要同时管理多个容器、配置复杂参数、保证可重复部署时,Docker Compose 才是提升效率的关键武器。
本期将从零开始介绍 Docker Compose:理解核心概念、学会编写 compose.yml、掌握常用命令,并通过三个典型场景展示如何真正“把它用起来”。
什么是 Docker Compose?
Docker Compose 是一个用于定义和运行多容器应用的工具。你只需要在一个 YAML(DevOps 世界的“共同语言”:YAML 入门指南) 文件中描述:
-
• 有哪些容器? -
• 每个容器如何构建? -
• 需要哪些端口、环境变量、卷? -
• 它们之间如何互联?
然后一条命令:
docker compose up -d
多容器环境瞬间启动!实现环境配置的真正“一键重现”。
为什么要使用 Docker Compose?
|
|
|
|
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Docker Compose = 可复制、可维护、多容器协作的最佳实践。
Docker Compose 文件结构详解
Docker Compose 采用 compose.yml 文件,一般包含这些核心部分:
version: "3.9"
services:
web:
image: nginx:1.27
ports:
- "80:80"
volumes:
- ./html:/usr/share/nginx/html
db:
image: mysql:8
environment:
MYSQL_ROOT_PASSWORD: "123456"
volumes:
- dbdata:/var/lib/mysql
volumes:
dbdata:
关键配置说明
|
|
|
|---|---|
| services |
|
| image |
|
| build |
|
| ports |
|
| volumes |
|
| environment |
|
| depends_on |
|
| networks |
|
常用 Docker Compose 命令
启动 / 停止相关命令
docker compose up
-
• 会创建容器 -
• 创建网络 -
• 创建卷 -
• 启动所有服务
常用参数:
-
• -d # 后台运行(最常用) -
• --build # 重新构建镜像
作用:
启动所有服务
使用场景:
-
• 启动整个项目 -
• 重启开发环境 -
• 部署生产服务
docker compose down
常用参数:
-
• -v # 删除 volume -
• --rmi all # 删除所有镜像
作用:
停止所有服务并删除容器、网络
使用场景:
-
• 清理整个项目 -
• 测试环境重复部署 -
• 重置开发环境
docker compose stop
docker compose start
-
• stop:停止容器,但不删除 -
• start:仅启动已有容器
使用场景:
维护容器但不删除数据时
docker compose restart
使用场景:
修改配置后快速重启服务
查看容器状态 / 日志
docker compose ps
作用:
查看当前 compose 项目所有容器状态(相当于 docker ps 的 compose 版本)
docker compose logs
常用参数:
-
• -f # 实时查看日志 -
• service-name # 查看某个服务日志
使用场景:
-
• 调试容器是否启动成功 -
• 查看项目运行状态
构建镜像 / 拉取镜像
docker compose build
常用参数:
-
• --no-cache # 不使用缓存 -
• --quiet # 静默输出
使用场景:
-
• 修改 Dockerfile 后重新构建 -
• 不用 docker build,全通过 compose 管理
docker compose pull
场景:
-
• 更新所有服务镜像 -
• CI/CD 自动部署前
docker compose push
场景:
推送镜像到镜像仓库(CI/CD 使用)
进入容器 / 执行命令
docker compose exec SERVICE bash
场景:
-
• 进入某个容器的终端(首选方式) -
• 调试应用、运行命令
前提:容器正在运行
docker compose run SERVICE bash
与 exec 区别:
|
|
|
|---|---|
|
|
|
|
|
创建一个新容器
|
使用场景:
-
• 只想临时跑一个命令,不需要现有容器 -
• 数据迁移、数据库初始化脚本
查看项目文件 / 配置信息
docker compose config
场景:
-
• 检查 compose 文件是否语法正确 -
• 查看变量替换结果(env 文件) -
• 调试 compose 配置时非常有用
性能相关:扩容 / 缩容
docker compose up --scale web=3 -d
作用:
扩容某个服务实例数量(比如 web 服务扩成 3 个实例)
场景:
-
• 微服务自动扩容 -
• 高并发 test 环境
清理资源
docker compose rm
场景:
-
• 删除已经停止的容器 -
• 保留 volume 和 network
docker compose down -v
场景:
-
• 删除所有数据卷(会丢数据) -
• 开发测试环境重置
所有常用命令总结表(速查版)
|
|
|
|---|---|
docker compose attach |
|
docker compose build |
|
docker compose commit |
|
docker compose config |
|
docker compose cp |
|
docker compose create |
|
docker compose down |
|
docker compose events |
|
docker compose exec |
|
docker compose export |
|
docker compose images |
|
docker compose kill |
|
docker compose logs |
|
docker compose ls |
|
docker compose pause |
|
docker compose port |
|
docker compose ps |
|
docker compose publish |
|
docker compose pull |
|
docker compose push |
|
docker compose restart |
|
docker compose rm |
|
docker compose run |
|
docker compose scale |
|
docker compose start |
|
docker compose stats |
|
docker compose stop |
|
docker compose top |
|
docker compose unpause |
|
docker compose up |
|
docker compose version |
|
docker compose volumes |
|
docker compose wait |
|
docker compose watch |
|
实战场景 1:Nginx + PHP-FPM(经典 LNMP)
适用于本地开发、测试环境。
version: "3.9"
services:
nginx:
image: nginx:latest
ports:
- "8080:80"
volumes:
- ./code:/var/www/html
- ./nginx.conf:/etc/nginx/conf.d/default.conf
depends_on:
- php
php:
image: php:8.3-fpm
volumes:
- ./code:/var/www/html
启动:
docker compose up -d
浏览器访问:
http://localhost:8080
实战场景 2:WordPress 一键部署(含 MySQL)
version: '3.9'
services:
db:
image: mysql:8
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: wordpress
volumes:
- db_data:/var/lib/mysql
wordpress:
image: wordpress:latest
ports:
- "8081:80"
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: root
WORDPRESS_DB_PASSWORD: 0MlbIYOLn2VB1JEeLlvE
depends_on:
- db
volumes:
db_data:
访问:
http://localhost:8081
真正实现 3 分钟上线一个博客系统。
实战场景 3:部署带后端的前后端项目
目录结构:
project/
frontend/
backend/
compose.yml
compose.yml:
version: "3.9"
services:
frontend:
build: ./frontend
ports:
- "3000:3000"
depends_on:
- backend
backend:
build: ./backend
environment:
DB_HOST: mysql
ports:
- "8000:8000"
mysql:
image: mysql:8
environment:
MYSQL_ROOT_PASSWORD: root
volumes:
- db:/var/lib/mysql
volumes:
db:
开发者只需要命令:
docker compose up -d --build
即可快速进入开发。
Docker Compose 最佳实践
使用 .env 管理敏感变量
在同级目录创建 .env:
MYSQL_PASSWORD=123456
compose.yml 使用:
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_PASSWORD}
使用 profiles 管理不同环境
services:
redis:
image: redis
profiles: ["dev"]
开发启动:
docker compose --profile dev up -d
使用 healthcheck 提升稳定性
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:80"]
interval: 30s
retries: 3
写在最后
早期使用的 docker-compose 命令,需要单独安装,在 2020 年之后官方逐步停止更新,并建议迁移到新版。新的命令不需要单独安装,只要安装 Docker Desktop 或新版本 Docker 即可,命令格式得到统一。
|
|
|
|
|
|---|---|---|---|
docker-compose |
|
|
|
docker compose |
|
|
|
Docker Compose = 开发与部署的生产力加速器,通过一个 compose.yml 文件即可:
-
• 定义整个应用环境 -
• 保证环境一致性 -
• 一键启动/停止多容器服务 -
• 快速迁移与重建 -
• 简化团队协作
无论你是做开发、运维、DevOps 或自建服务,Compose 都是一项必须掌握的技能。