Docker Compose 是什么
定义:Compose 是一个编排工具。你写一个 docker-compose.yml 文件,描述「我要同时跑哪几个容器、它们怎么连、端口怎么开、数据存哪」,然后一条命令全起来。
类比:Dockerfile 是「做一道菜」,Compose 是「一桌菜的菜单 + 上菜顺序 + 谁坐哪」。
基本结构
1 | services: # 定义每个容器 |
三层结构:services(必写)、volumes、networks(可选,不写会自动创建)。
注意缩进:YAML 用空格,不能用 Tab,同级要对齐。
常用配置
image —— 用现成镜像
1 | services: |
直接从 Docker Hub 拉,不需要 Dockerfile。
build —— 从 Dockerfile 构建
1 | services: |
ports —— 端口映射
1 | ports: |
格式:宿主端口:容器端口。
不写 ports,容器之间还能互通,但外面访问不了。
environment —— 环境变量
1 | environment: |
- 直接写值,或从
.env文件读(${变量名})。 - 敏感的密码建议放
.env,别写死在 yml。
volumes —— 数据持久化 / 文件挂载
1 | volumes: |
三种写法:
命名卷名:容器路径:Docker 自己管理,适合数据库。./宿主路径:容器路径:宿主文件挂进容器。- 结尾
:ro表示只读。
为什么需要:容器删了数据就没了,volumes 让数据留在宿主上。
depends_on —— 启动顺序
1 | depends_on: |
只保证启动顺序,不保证服务就绪。数据库还没初始化完,后端可能就连了。
要保证就绪,用 healthcheck + condition:
1 | depends_on: |
healthcheck —— 健康检查
1 | healthcheck: |
restart —— 重启策略
1 | restart: unless-stopped # 除非手动停,否则挂了自动重启(推荐) |
command / entrypoint —— 覆盖启动命令
1 | command: redis-server --requirepass mypass |
覆盖镜像里的 CMD。
networks —— 网络
1 | services: |
默认情况:同一个 compose 文件里的服务自动在同一个网络,用服务名当主机名互相访问。
比如后端连数据库,URL 写 jdbc:postgresql://postgres:5432/lightdb,postgres 就是服务名。
profiles —— 按需启动
1 | services: |
正常 docker compose up 不会启动它,只有 docker compose --profile build up 才启动。
.env 文件
和 docker-compose.yml 同目录,写变量:
1 | DB_PASSWORD=abc123 |
compose 里用 ${DB_PASSWORD} 引用。不要提交到 Git。
常用命令
1 | docker compose up -d # 后台启动所有服务 |