一、基础概念
- Compose 作用
- docker:管理单个容器;docker‑compose:编排多个容器。
- 通过
docker‑compose.yml文件定义多个服务,一条命令完成启动、停止、重启,不用写一堆 docker‑run。 - 3 个核心概念
- Service:容器服务,nginx、mysql、redis 都是服务。
- Project 项目:yml 所在文件夹名称就是项目名,同一项目内部容器互通。
- Network 网络:compose 默认创建桥接网络,只有本项目容器可以互相通信。
- 版本区分
- Compose V2(新版):命令
docker compose(中间空格,推荐),docker20.10 以后自带。 - Compose V1(旧版):命令
docker‑compose(横线),官方废弃。
二、常用命令(重点)
注意:命令必须在 docker‑compose.yml 所在目录执行
bash
运行
# 查看版本
docker compose version
# 创建并启动容器,后台运行 -d
docker compose up -d
# 查看运行中的容器
docker compose ps
# 查看日志
docker compose logs
# 实时跟踪日志
docker compose logs -f
# 只看某一个服务日志
docker compose logs -f mysql
# 停止容器,不会删除容器、数据卷、网络
docker compose stop
# 启动已经停止的服务
docker compose start
# 停止并删除容器、默认网络;不会删除挂载数据卷
docker compose down
# 停止容器同时删除数据卷(慎用,数据清空)
docker compose down -v
# 修改yml配置后重载生效
docker compose up -d
# 列出项目内镜像
docker compose images
# 重启指定服务
docker compose restart mysql
三、docker‑compose.yml 语法(YAML 缩进必须 2 空格,不能用 tab)
顶级关键字
- version:新版本 compose 可以省略 version 字段。
- services:定义所有容器服务,最核心部分。
- volumes:定义外部数据卷。
- networks:自定义网络。
services 下面常用配置项
yaml
services:
mysql: #服务名称,容器之间就用这个名字通信
image: mysql:5.7 #指定镜像
container_name: mysql01 #自定义容器名(可选,不写自动生成)
restart: always #重启策略:always总是重启;no默认不重启;on‑failure异常重启
environment: #环境变量,配置账号密码
MYSQL_ROOT_PASSWORD: 123456
ports:
- "3306:3306" #端口映射:宿主机端口:容器内部端口
volumes:
- ./mysql_data:/var/lib/mysql #数据卷挂载:宿主机目录:容器目录
- ./my.cnf:/etc/mysql/my.cnf #挂载配置文件
networks:
- mynet #加入自定义网络
nginx:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./html:/usr/share/nginx/html
- ./nginx.conf:/etc/nginx/conf.d/default.conf
depends_on: #依赖,启动顺序:先启动mysql再启动nginx
- mysql
networks:
- mynet
networks:
mynet: #自定义网络名称
driver: bridge #网络类型默认bridge
参数解释
depends_on:只控制启动先后顺序,并不会等待数据库初始化完毕。mysql 启动初始化较慢,java 程序还是会连接失败,代码层面做好重试。- 容器之间访问:不用宿主机 IP,直接写服务名。例:mysql 服务名就填 mysql,端口写容器内端口 3306。
- volumes 两种写法:
- 命名卷:
mysql_data:/var/lib/mysql,由 docker 管理,放在 docker 目录。 - 绑定挂载:
./mysql_data:/var/lib/mysql,指定宿主机当前目录,开发最常用。
- 命名卷:
四、两种构建方式
方式 1:直接用现成镜像(image),上面示例就是。
方式 2:build 基于 Dockerfile 构建自己镜像
yaml
services:
app:
build:
context: ./ #dockerfile所在目录
dockerfile: Dockerfile
ports:
- "8080:8080"
depends_on:
- mysql
执行docker compose up -d,会自动 build 镜像再启动容器。
五、环境变量进阶用法
- 在 yml 里写死 environment 不灵活,可以单独
.env文件 项目目录新建.env 文件
env
MYSQL_PWD=123456
yml 文件引用变量:
yaml
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_PWD}
六、多环境配置(拓展)
- docker‑compose.yml:公共配置
- docker‑compose‑dev.yml:开发环境覆盖配置
- docker‑compose‑prod.yml:生产环境 启动指定配置文件:
bash
运行
docker compose -f docker-compose.yml -f docker-compose-prod.yml up -d
七、避坑总结
- yaml 缩进严格 2 空格,不能用 tab,冒号后面必须空格,格式错误启动失败。
- depends_on 只控制启动顺序,不能等待服务就绪。
- compose 项目隔离:不同项目默认网络不同,不能互通;想要互通就要加入同一个自定义 network。
docker compose down -v会删除数据卷,生产环境禁止随便使用。- 修改 yml 配置文件之后,必须执行
docker compose up -d重新加载配置,restart 不读取新配置。
八、最简可运行示例(可直接复制保存为 docker‑compose.yml)
yaml
services:
redis:
image: redis:6
restart: always
ports:
- "6379:6379"
volumes:
- ./redis-data:/data
mysql:
image: mysql:5.7
restart: always
environment:
MYSQL_ROOT_PASSWORD: 123456
ports:
- "3306:3306"
volumes:
- ./mysql-data:/var/lib/mysql
执行启动:
bash
运行
docker compose up -d