
作者:王仕宇(JavaPub)
前言
在学习 Docker 初期,我们经常使用:
bash
docker run nginx
启动一个服务。
但是实际开发项目中,一个应用通常不可能只有一个容器。
例如一个普通后端项目:
用户请求
↓
Nginx
↓
Go / Java 后端
↓
MySQL
↓
Redis
↓
消息队列
如果手动启动:
bash
docker run mysql
docker run redis
docker run nginx
docker run backend
不仅麻烦,而且容易出现:
- 参数忘记配置
- 网络无法通信
- 环境变量丢失
- 部署流程复杂
这时候就需要 Docker Compose。
一、什么是 Docker Compose?
Docker Compose 是 Docker 官方提供的多容器编排工具。
简单理解:
用一个 YAML 文件,定义整个项目需要哪些容器,以及它们如何运行。
以前:
bash
docker run mysql
docker run redis
docker run nginx
docker run backend
现在:
yaml
docker-compose.yml
定义:
yaml
mysql
redis
nginx
backend
然后:
bash
docker compose up -d
一次启动全部服务。
二、Docker Compose 核心结构
一个 Compose 文件主要包含:
yaml
services:
volumes:
networks:
例如:
yaml
version: "3"
services:
web:
image: nginx
db:
image: mysql
volumes:
networks:
对应关系:
services
|
|
+--- 容器
volumes
|
|
+--- 数据持久化
networks
|
|
+--- 容器通信
三、安装 Docker Compose
现在新版 Docker 已经内置:
查看:
bash
docker compose version
输出:
Docker Compose version v2.x
以前版本:
bash
docker-compose version
注意:
新版推荐:
bash
docker compose
而不是:
bash
docker-compose
四、第一个 Docker Compose 项目
创建目录:
bash
mkdir compose-demo
cd compose-demo
创建:
docker-compose.yml
内容:
yaml
services:
nginx:
image: nginx
ports:
- "8080:80"
启动:
bash
docker compose up -d
查看:
bash
docker ps
访问:
http://localhost:8080
成功看到 nginx 页面。
五、Compose 常用命令
启动服务
bash
docker compose up
后台启动:
bash
docker compose up -d
停止服务
bash
docker compose down
区别:
stop:
停止容器
down:
停止 + 删除容器 + 网络
查看运行状态
bash
docker compose ps
例如:
NAME
mysql
redis
backend
查看日志
全部服务:
bash
docker compose logs
实时:
bash
docker compose logs -f
指定服务:
bash
docker compose logs -f mysql
重启服务
bash
docker compose restart
重新构建镜像
代码修改后:
bash
docker compose build
或者:
bash
docker compose up -d --build
六、部署一个完整后端项目
假设:
项目
├── backend
├── nginx
└── docker-compose.yml
架构:
用户
|
Nginx
|
Backend
/ \
MySQL Redis
七、MySQL + Redis + 后端 Compose 示例
docker-compose.yml:
yaml
services:
mysql:
image: mysql:8.0
container_name: mysql
environment:
MYSQL_ROOT_PASSWORD: 123456
MYSQL_DATABASE: app
volumes:
- mysql-data:/var/lib/mysql
ports:
- "3306:3306"
redis:
image: redis:7
container_name: redis
ports:
- "6379:6379"
backend:
image: my-backend
container_name: backend
depends_on:
- mysql
- redis
ports:
- "8080:8080"
environment:
DB_HOST: mysql
REDIS_HOST: redis
volumes:
mysql-data:
启动:
bash
docker compose up -d
最终:
mysql
redis
backend
全部启动。
八、Compose 网络原理
很多新人疑惑:
为什么 backend 可以访问:
mysql
而不是:
127.0.0.1
原因:
Compose 会自动创建网络。
例如:
app_default
|
-----------------
| | |
mysql redis backend
所以:
backend:
连接:
properties
MYSQL_HOST=mysql
Redis:
properties
REDIS_HOST=redis
不用填写 IP。
九、环境变量管理
生产项目:
不要直接写:
yaml
MYSQL_ROOT_PASSWORD:123456
推荐:
创建:
.env
内容:
env
MYSQL_PASSWORD=123456
MYSQL_DATABASE=app
Compose:
yaml
environment:
MYSQL_ROOT_PASSWORD:
${MYSQL_PASSWORD}
优势:
- 开发环境一套
- 测试环境一套
- 生产环境一套
十、数据持久化
错误:
yaml
mysql:
image:mysql
删除容器:
bash
docker compose down
数据丢失。
正确:
yaml
volumes:
mysql-data:
services:
mysql:
volumes:
- mysql-data:/var/lib/mysql
数据:
容器删除
↓
数据还存在
十一、使用 Dockerfile 构建自己的服务
项目:
backend
├── Dockerfile
├── main.go
└── go.mod
Dockerfile:
dockerfile
FROM golang:1.23
WORKDIR /app
COPY .
RUN go build -o server
CMD ["./server"]
Compose:
yaml
backend:
build:
context: ./backend
ports:
- "8080:8080"
启动:
bash
docker compose up -d --build
流程:
代码
↓
Dockerfile
↓
Image
↓
Container
十二、健康检查 Healthcheck
生产环境:
不能只看容器是否启动。
例如:
MySQL:
yaml
mysql:
image:mysql
healthcheck:
test:
["CMD","mysqladmin","ping"]
interval:10s
效果:
容器启动
↓
检查服务
↓
正常才连接
十三、部署前后端分离项目
常见结构:
project
├── frontend
├── backend
├── mysql
├── redis
└── docker-compose.yml
Compose:
frontend
|
nginx
|
backend
|
mysql redis
一条命令:
bash
docker compose up -d
整个项目上线。
十四、生产环境最佳实践
1. 固定版本
不要:
yaml
image:mysql:latest
推荐:
yaml
image:mysql:8.0.36
2. 服务拆分
不要:
一个大容器
里面运行:
nginx
mysql
redis
backend
推荐:
一个服务
一个容器
3. 日志管理
查看:
bash
docker compose logs
生产:
接入:
- ELK
- Loki
- Prometheus
4. 限制资源
例如:
yaml
deploy:
resources:
limits:
cpus: "1"
memory: 512M
防止单个服务拖垮服务器。
十五、Docker Compose 与 Kubernetes
Docker Compose:
适合:
单机部署
开发环境
小型项目
测试环境
Kubernetes:
适合:
多服务器
自动扩容
高可用
大型企业
关系:
Docker Compose
↓
Docker
↓
Kubernetes
↓
云原生平台
十六、实际开发最常用组合
Web 项目
Nginx
+
Backend
+
MySQL
+
Redis
AI 应用
Frontend
+
API Server
+
模型服务
+
Redis
+
向量数据库
快速搭建开发环境
例如:
启动 MySQL:
bash
docker compose up mysql
启动 Redis:
bash
docker compose up redis
不用污染本机环境。
总结
Docker 解决:
如何运行应用。
Docker Compose 解决:
如何管理多个应用。
实际开发流程:
编写 Dockerfile
↓
创建 docker-compose.yml
↓
docker compose up -d
↓
完整环境启动
对于后端开发者:
掌握 Docker Compose 后,
无论是:
- Go 服务
- Java SpringBoot
- Node.js
- Python
- AI Agent 服务
都可以快速完成部署。
作者:王仕宇 JavaPub