想象一下:你要部署一个 Web 应用,需要 Nginx + MySQL + Redis 三个容器。
你是不是要分别写三条 docker run 命令,还要记得网络配置、端口映射、数据卷......
改一次配置,又得重新记一遍命令?
Docker Compose 就是来拯救你的! 用一个配置文件,一条命令,启动所有容器。
一、什么是 Docker Compose?📦
官方定义:
Compose 是 Docker 官方的开源项目,用于定义和运行多个 Docker 容器的应用 ,实现对容器集群的快速编排。
大白话解释:
Compose 是一个 容器"总指挥" 。
你把所有容器的配置(用什么镜像、挂载什么目录、开放哪些端口、容器间依赖关系)写在一个 docker-compose.yml 文件里。
然后执行 docker-compose up,Compose 就会按照你的"剧本"自动把整个环境跑起来。
二、为什么需要 Compose?🤔
在没有 Compose 之前,启动一个多容器应用(比如 WordPress + MySQL)你需要:
bash
# 创建网络
docker network create mynet
# 启动 MySQL
docker run -d --name mysql --network mynet -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
# 启动 WordPress
docker run -d --name wordpress --network mynet -p 8080:80 -e WORDPRESS_DB_HOST=mysql wordpress
-
命令长、容易错
-
修改配置(比如换端口)要删掉重建
-
团队协作时,每个人都要记住这些命令
用 Compose 后:
写一个 docker-compose.yml,然后 docker-compose up -d 就全部启动。
配置文件可以放进 Git,团队每个人都能一键复现相同的环境。
三、Compose 核心概念 🧠
| 概念 | 解释 | 类比 |
|---|---|---|
| 服务(Service) | 一个容器的配置(镜像、端口、卷等) | 一个演员的角色 |
| 项目(Project) | 一组服务组成的完整应用 | 整部戏 |
| docker-compose.yml | 描述服务关系的配置文件 | 剧本 |
一个典型的 docker-compose.yml 里可以定义多个服务,比如 web、db、redis。
四、实战案例:用 Compose 搭建 WordPress 博客 📝
我们用 Compose 一键部署 WordPress(含 MySQL)。
步骤 1:安装 Docker Compose
Linux 系统(以 CentOS 为例)
bash
# 下载最新版(版本号可去官网查)
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 添加执行权限
sudo chmod +x /usr/local/bin/docker-compose
# 检查是否安装成功
docker-compose --version
输出类似:
docker-compose version 1.29.2, build 5becea4c
💡 Mac/Windows 用户安装 Docker Desktop 时已自带 Compose,无需额外安装。
步骤 2:创建项目目录
bash
mkdir mywordpress
cd mywordpress
步骤 3:编写 docker-compose.yml
创建一个文件 docker-compose.yml,内容如下:
yaml
version: '3.8'
services:
db:
image: mysql:5.7
restart: always
environment:
MYSQL_ROOT_PASSWORD: 123456
MYSQL_DATABASE: wordpress
volumes:
- db_data:/var/lib/mysql
networks:
- wpnet
wordpress:
image: wordpress:latest
restart: always
ports:
- "8080:80"
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: root
WORDPRESS_DB_PASSWORD: 123456
WORDPRESS_DB_NAME: wordpress
depends_on:
- db
volumes:
- wp_files:/var/www/html
networks:
- wpnet
volumes:
db_data:
wp_files:
networks:
wpnet:
配置解读:
-
services:定义两个服务
db(MySQL)和wordpress -
image:使用的镜像
-
environment:环境变量,相当于
-e -
volumes:数据卷持久化
-
ports:端口映射
宿主机:容器 -
depends_on:启动顺序,先启动
db再启动wordpress -
networks:自定义网络,让两个容器用容器名互相访问(如
db主机名)
步骤 4:启动整个应用
bash
docker-compose up -d
-d 表示后台运行。
第一次运行会拉取镜像,之后秒启。
步骤 5:访问博客
浏览器打开 http://你的服务器IP:8080,就能看到 WordPress 安装界面了!
步骤 6:常用管理命令
| 操作 | 命令 |
|---|---|
| 启动所有服务 | docker-compose up -d |
| 停止所有服务 | docker-compose down |
| 查看日志 | docker-compose logs -f |
| 重启某个服务 | docker-compose restart wordpress |
| 停止并删除容器、网络(保留数据卷) | docker-compose down |
| 停止并删除所有(包括数据卷) | docker-compose down -v |
| 重新构建镜像后启动 | docker-compose up -d --build |
步骤 7:清理环境
bash
# 停止并删除容器、网络(数据卷还在)
docker-compose down
# 如果想要彻底删除数据卷(会丢失所有数据)
docker-compose down -v
五、Compose 文件的核心元素 🔧
一个完整的 docker-compose.yml 可以包含以下顶级元素:
| 元素 | 作用 | 示例 |
|---|---|---|
version |
指定 Compose 文件格式版本 | version: '3.8' |
services |
定义各个容器 | web: 、db: |
volumes |
定义命名数据卷 | db_data: |
networks |
定义自定义网络 | frontend: |
每个 service 下可以配置:
-
build:用 Dockerfile 构建(而不是
image) -
image:使用现成镜像
-
ports:端口映射
-
environment/
env_file:环境变量 -
volumes:挂载卷或宿主机目录
-
depends_on:依赖其他服务
-
restart:重启策略(
always、on-failure)
六、生产环境小贴士 ✅
-
不要用
latest标签指定具体版本号,如
mysql:5.7,避免版本变化导致不兼容。 -
敏感信息用
.env文件在
docker-compose.yml同级创建.env文件:MYSQL_PASSWORD=mysecret然后在
docker-compose.yml中用${MYSQL_PASSWORD}引用。 -
日志大小限制
在服务下添加:
yaml
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3" -
指定容器重启策略
restart: always保证服务器重启后容器自动恢复。
七、总结:Compose 带来的改变 🎯
| 没有 Compose | 有了 Compose |
|---|---|
多条 docker run 命令 |
一个 docker-compose.yml 文件 |
| 手动创建网络、数据卷 | 自动创建 |
| 容易忘参数,难以复用 | 配置文件可版本控制 |
| 团队环境不一致 | 一键复现相同环境 |
一句话记住 Compose:
把"多容器应用"当作一个整体来管理。