如果你经常使用 Docker,一定遇到过这样的场景:为了运行一个 Web 应用,需要手动启动数据库容器、Redis 缓存容器、应用本身容器,还要分别配置端口映射、环境变量、网络连接——步骤繁琐且容易出错。Docker Compose 正是为解决这个问题而生:它允许你用一个 YAML 文件定义多容器应用的所有配置,通过一条命令完成启动、停止、重启等操作,让多容器管理变得简单高效。
一、Docker Compose 是什么?
Docker Compose 是 Docker 官方推出的多容器编排工具,核心功能是通过 docker-compose.yml 文件定义应用的所有服务(容器)、网络、存储卷等依赖关系,然后通过 docker-compose 命令一键管理整个应用生命周期。
它的核心优势在于:
- 简化配置:用 YAML 替代复杂的
docker run命令,配置可版本化(存入 Git); - 一键操作:一条命令启动所有服务,无需逐个容器操作;
- 环境一致性:开发、测试、生产环境使用相同的 Compose 配置,避免「开发环境能跑,生产环境报错」的问题;
- 依赖管理:自动处理容器间的依赖关系(如先启动数据库,再启动应用)。
二、安装 Docker Compose
在使用 Docker Compose 前,需确保已安装 Docker Engine(Compose 依赖 Docker 运行)。以下是不同系统的安装方法:
1. Linux 系统(以 Ubuntu 为例)
步骤 1:安装 Docker Engine
如果未安装 Docker,先执行以下命令:
# 更新软件包列表
sudo apt update
# 安装依赖包
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common
# 添加 Docker GPG 密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# 添加 Docker 软件源
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 安装 Docker Engine
sudo apt update && sudo apt install -y docker-ce docker-ce-cli containerd.io
# 验证安装
docker --version
步骤 2:安装 Docker Compose
# 下载最新稳定版(可替换为官网最新版本号,如 v2.23.3)
sudo curl -L "https://github.com/docker/compose/releases/download/v2.23.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 赋予执行权限
sudo chmod +x /usr/local/bin/docker-compose
# 验证安装
docker-compose --version
2. Windows/macOS 系统
Windows 和 macOS 用户安装 Docker Desktop 即可自动包含 Docker Compose,无需单独安装:
- 下载地址:Docker Desktop 官方下载
- 安装后启动 Docker Desktop,在终端执行
docker-compose --version验证。
三、Docker Compose 核心概念
在编写 docker-compose.yml 前,需理解三个核心概念:
1. 服务(Services)
一个「服务」对应一个容器(或一组相同的容器,用于负载均衡),是 Compose 配置的核心。例如:
- 一个
web服务:运行 Node.js 应用的容器; - 一个
db服务:运行 MySQL 数据库的容器; - 一个
redis服务:运行 Redis 缓存的容器。
每个服务可配置镜像、端口、环境变量、依赖关系等。
2. 网络(Networks)
默认情况下,Compose 会为应用创建一个默认网络,所有服务容器都会加入这个网络,容器间可通过「服务名」互相访问(无需用 IP 地址)。例如:web 服务可以通过 db:3306 访问 db 服务的 MySQL。

3. 存储卷(Volumes)
用于持久化数据(避免容器删除后数据丢失)或共享数据(多个容器共享文件)。例如:MySQL 的数据目录可以挂载到主机的卷,确保容器重启后数据不丢失。
四、编写第一个 docker-compose.yml
我们以一个「Node.js + MySQL」的 Web 应用为例,编写 Compose 配置文件。
场景说明
- 前端:Node.js 应用(镜像用
node:16-alpine); - 后端数据库:MySQL 5.7(镜像用
mysql:5.7); - 需求:Node.js 应用需连接 MySQL,且 MySQL 数据持久化。
步骤 1:创建项目目录
mkdir docker-compose-demo && cd docker-compose-demo
步骤 2:编写 docker-compose.yml
在项目目录下创建 docker-compose.yml 文件,内容如下:
# 版本号(需与 Docker Compose 版本兼容,v2 或 v3 是主流)
version: '3.8'
# 定义所有服务
services:
# 1. Web 服务(Node.js 应用)
web:
# 使用的镜像(若本地没有,Compose 会自动拉取)
image: node:16-alpine
# 容器名称(可选,默认是「项目名_服务名_序号」)
container_name: node-web
# 工作目录(容器内的目录)
working_dir: /app
# 端口映射:主机端口:容器端口
ports:
- "3000:3000"
# 挂载目录:主机目录:容器目录(将本地代码同步到容器,方便开发)
volumes:
- ./app:/app
# 启动命令(容器启动后执行的命令)
command: sh -c "npm install && node app.js"
# 依赖关系:先启动 db 服务,再启动 web
depends_on:
- db
# 环境变量(传递给容器)
environment:
- DB_HOST=db # 数据库地址(用服务名访问)
- DB_USER=root
- DB_PASSWORD=123456
- DB_NAME=mydb
# 加入默认网络(可选,默认已加入)
networks:
- app-network
# 2. MySQL 服务
db:
image: mysql:5.7
container_name: mysql-db
# 端口映射(主机 3306 映射到容器 3306)
ports:
- "3306:3306"
# 环境变量(MySQL 初始化配置)
environment:
- MYSQL_ROOT_PASSWORD=123456 # root 密码
- MYSQL_DATABASE=mydb # 自动创建的数据库名
# 存储卷:持久化 MySQL 数据(避免容器删除后数据丢失)
volumes:
- mysql-data:/var/lib/mysql # 挂载到命名卷 mysql-data
networks:
- app-network
# 定义存储卷(命名卷,由 Docker 管理存储位置)
volumes:
mysql-data:
# 定义网络(可选,默认会创建一个名为「项目名_default」的网络)
networks:
app-network:
driver: bridge # 桥接网络(默认类型)
步骤 3:编写 Node.js 测试代码
在项目目录下创建 app 文件夹,然后在 app 内创建 app.js 和 package.json:
package.json(依赖配置)
{
"dependencies": {
"express": "^4.18.2",
"mysql2": "^3.6.2"
}
}
app.js(简单的 Web 服务,连接 MySQL)
const express = require('express');
const mysql = require('mysql2/promise');
const app = express();
const port = 3000;
// 数据库配置(从环境变量读取)
const dbConfig = {
host: process.env.DB_HOST,
user: process.env.DB_USER,
password: process.env.DB_PASSWORD,
database: process.env.DB_NAME
};
// 测试数据库连接
async function testDbConnection() {
try {
const connection = await mysql.createConnection(dbConfig);
console.log('MySQL 连接成功!');
await connection.end();
} catch (err) {
console.error('MySQL 连接失败:', err);
}
}
// 定义接口
app.get('/', (req, res) => {
res.send('Docker Compose 入门教程:Node.js + MySQL 应用运行中!');
});
// 启动服务
app.listen(port, async () => {
console.log(`Web 服务运行在 http://localhost:${port}`);
await testDbConnection();
});
五、Docker Compose 常用命令
编写完配置文件后,通过以下命令管理应用:
1. 启动应用(后台运行)
docker-compose up -d
-d:后台运行容器(不加则前台运行,可看到日志输出);- 第一次运行时,Compose 会自动拉取镜像、创建网络和卷、启动容器。
2. 查看容器状态
docker-compose ps
输出示例:
Name Command State Ports
-------------------------------------------------------------------------------------
mysql-db docker-entrypoint.sh mysqld Up 0.0.0.0:3306->3306/tcp, 33060/tcp
node-web sh -c npm install && node app.js Up 0.0.0.0:3000->3000/tcp
3. 查看服务日志
# 查看所有服务日志
docker-compose logs
# 查看指定服务(如 web)的日志(-f 实时跟踪)
docker-compose logs -f web
4. 进入容器内部
# 进入 web 服务的容器
docker-compose exec web sh
5. 停止应用(保留容器)
docker-compose stop
6. 重启应用
docker-compose restart
7. 停止并删除容器、网络(保留卷)
docker-compose down
- 若要同时删除卷,需加
-v参数:docker-compose down -v
8. 构建自定义镜像(若服务需从 Dockerfile 构建)
如果你的应用需要自定义镜像(而非直接使用官方镜像),可在 services 中配置 build 字段:
services:
web:
build: ./app # 指定 Dockerfile 所在目录
# 其他配置...
然后执行构建并启动:
docker-compose up -d --build
六、常见问题与注意事项
1. 依赖关系(depends_on)的局限性
depends_on 仅保证容器启动顺序(先启动 db 再启动 web),但不保证 db 服务完全就绪(如 MySQL 可能还在初始化)。解决方法:
- 在应用代码中添加重试逻辑(如 Node.js 连接 MySQL 时多次尝试);
- 使用第三方工具(如
wait-for-it)等待服务就绪。
2. 存储卷的类型
Compose 支持两种卷:
- 命名卷:由 Docker 管理,存储位置在
/var/lib/docker/volumes/(Linux),适合持久化数据; - 绑定挂载:将主机目录直接挂载到容器,适合开发时同步代码(如示例中的
./app:/app)。
3. 环境变量的优先级
Compose 读取环境变量的顺序(从高到低):
- 命令行参数(如
docker-compose run -e KEY=VALUE web); docker-compose.yml中的environment字段;- 环境变量文件(如
.env文件,需在docker-compose.yml中通过env_file引用)。
4. 网络访问
- 容器间通过服务名访问(如
web服务访问db:3306); - 主机访问容器需通过端口映射(如
localhost:3000访问web服务)。
七、总结
Docker Compose 是多容器应用的「瑞士军刀」,通过简单的 YAML 配置和命令,就能快速管理复杂的应用架构。本文从安装、核心概念到实战案例,覆盖了入门所需的全部内容——你可以在此基础上扩展更多服务(如 Redis、Nginx),或优化配置(如健康检查、资源限制)。
下一步建议:尝试将自己的项目用 Compose 管理,或学习 Compose 的高级特性(如多环境配置、容器缩放),让容器化部署更高效!
如果在使用中遇到问题,可参考 Docker Compose 官方文档 或留言交流~









留言0