Ezio's Blog
Posts Categories Tags Music Mood About
Ezio's Blog· Light
☰ Menu
Posts Categories Tags Music Mood About
Expand all Back to top Go to bottom

Docker Compose

Author: Ezio Date: May 11, 2026  12:52:20 Category: Docker

Docker Compose 是什么

定义:Compose 是一个编排工具。你写一个 docker-compose.yml 文件,描述「我要同时跑哪几个容器、它们怎么连、端口怎么开、数据存哪」,然后一条命令全起来。

类比:Dockerfile 是「做一道菜」,Compose 是「一桌菜的菜单 + 上菜顺序 + 谁坐哪」。

基本结构

1
2
3
4
5
6
7
8
9
10
11
services:        # 定义每个容器
mysql:
image: mysql:8
...
backend:
image: my-backend
...
volumes: # 定义数据卷
dbdata:
networks: # 定义网络
mynet:

三层结构:services(必写)、volumes、networks(可选,不写会自动创建)。

注意缩进:YAML 用空格,不能用 Tab,同级要对齐。

常用配置

image —— 用现成镜像

1
2
3
services:
mysql:
image: mysql:8.0

直接从 Docker Hub 拉,不需要 Dockerfile。

build —— 从 Dockerfile 构建

1
2
3
4
5
6
7
services:
backend:
build: ./backend # 指向含 Dockerfile 的目录
# 或
build:
context: ./backend
dockerfile: Dockerfile.prod

ports —— 端口映射

1
2
3
4
ports:
- "80:80" # 宿主 80 → 容器 80
- "8080:8080"
- "127.0.0.1:3306:3306" # 只允许本机访问

格式:宿主端口:容器端口。
不写 ports,容器之间还能互通,但外面访问不了。

environment —— 环境变量

1
2
3
4
environment:
SPRING_PROFILES_ACTIVE: prod
DB_URL: jdbc:postgresql://postgres:5432/lightdb
DB_PASSWORD: ${DB_PASSWORD} # 从 .env 文件读
  • 直接写值,或从 .env 文件读(${变量名})。
  • 敏感的密码建议放 .env,别写死在 yml。

volumes —— 数据持久化 / 文件挂载

1
2
3
4
volumes:
- pgdata:/var/lib/postgresql/data # 命名卷(Docker 管理)
- ./nginx/conf.d:/etc/nginx/conf.d:ro # 宿主目录挂进容器,只读
- ./app.jar:/app/app.jar:ro # 单文件挂载

三种写法:

  • 命名卷名:容器路径:Docker 自己管理,适合数据库。
  • ./宿主路径:容器路径:宿主文件挂进容器。
  • 结尾 :ro 表示只读。

为什么需要:容器删了数据就没了,volumes 让数据留在宿主上。

depends_on —— 启动顺序

1
2
3
depends_on:
- postgres
- redis

只保证启动顺序,不保证服务就绪。数据库还没初始化完,后端可能就连了。

要保证就绪,用 healthcheck + condition:

1
2
3
depends_on:
postgres:
condition: service_healthy

healthcheck —— 健康检查

1
2
3
4
5
6
healthcheck:
test: ["CMD-SHELL", "pg_isready -U light -d lightdb"]
interval: 10s # 每 10 秒查一次
timeout: 5s # 超时 5 秒
retries: 5 # 失败 5 次算不健康
start_period: 30s # 启动后 30 秒内不算失败

restart —— 重启策略

1
2
3
4
restart: unless-stopped    # 除非手动停,否则挂了自动重启(推荐)
# restart: always # 总是重启
# restart: on-failure # 只有失败才重启
# restart: "no" # 不重启(默认)

command / entrypoint —— 覆盖启动命令

1
command: redis-server --requirepass mypass

覆盖镜像里的 CMD。

networks —— 网络

1
2
3
4
5
6
7
services:
backend:
networks:
- mynet
networks:
mynet:
driver: bridge

默认情况:同一个 compose 文件里的服务自动在同一个网络,用服务名当主机名互相访问。
比如后端连数据库,URL 写 jdbc:postgresql://postgres:5432/lightdb,postgres 就是服务名。

profiles —— 按需启动

1
2
3
services:
builder:
profiles: ["build"]

正常 docker compose up 不会启动它,只有 docker compose --profile build up 才启动。

.env 文件

和 docker-compose.yml 同目录,写变量:

1
2
DB_PASSWORD=abc123
DIFY_API_KEY=app-xxxx

compose 里用 ${DB_PASSWORD} 引用。不要提交到 Git。

常用命令

1
2
3
4
5
6
7
8
9
10
11
docker compose up -d              # 后台启动所有服务
docker compose up -d backend # 只启动 backend
docker compose ps # 看状态
docker compose logs -f backend # 看日志
docker compose restart backend # 重启
docker compose stop # 停(不删容器)
docker compose down # 停并删容器(保留 volumes)
docker compose down -v # 连数据卷一起删(危险)
docker compose build # 重新构建
docker compose pull # 拉最新镜像
docker compose exec backend sh # 进容器

Author: Ezio

Permalink: https://ezioy.cn/2026/05/11/Docker%20Compose/

License: Copyright (c) 2019 CC-BY-NC-4.0 LICENSE

Slogan: Nothing is true,Everything is permitted

Tag(s): # Docker
back · home
Dockerfile
Ezio © 2019 - 2026 | Powered by Hexo & Chic | 访客数量:   浏览次数: | 渝公网安备50011302222043 | 渝ICP备2023013933号-1