Docker Compose
🐳 Docker Compose
阅读原文 https://www.xiaozaoshu.top/articles/docker/compose
一、什么是 Docker Compose?
Docker Compose 是一个用于定义和运行多个 Docker 容器的工具。你只需用一个 docker-compose.yml 文件,描述好服务的配置,然后一条命令就可以启动整个系统。
适用场景:
- 需要运行多个服务(如 Web 服务 + 数据库 + 缓存)
- 希望用配置文件统一管理部署
- 开发、测试、部署环境一致性
二、安装 Docker Compose
1. 检查 Docker 是否已安装
docker -v
2. 检查 Docker Compose 是否集成(推荐使用 Docker Compose V2)
docker compose version
如果你看到版本号(如 Docker Compose version v2.27.1),说明已安装。
3. 手动安装(Linux 下,如果未集成)
mkdir -p ~/.docker/cli-plugins/curl -SL https://github.com/docker/compose/releases/latest/download/docker-compose-linux-x86_64 \\ -o ~/.docker/cli-plugins/docker-composechmod +x ~/.docker/cli-plugins/docker-composedocker compose version
三、Docker Compose 文件结构详解(docker-compose.yml)
一个典型的配置文件如下:
version: \"3.9\" # 指定Compose文件的语法版本services: # docker run -d --name redis -p 16379:6379 redis:7.2 redis-server --requirepass 1234@qwer redis: image: redis:7.2 container_name: xiaozaoshu-redis ports: - \"16379:6379\"
关键字段解释
versionCompose 文件版本servicesdocker run 容器imagebuildDockerfile 构建镜像ports宿主机:容器volumesenvironmentdepends_onnetworksversion
Docker Compose 文件的 语法版本(Compose File Format),用于指定当前 YAML 文件使用的是哪一套规则。
Compose 文件的版本取决于你所使用的:
- Docker Engine 的版本
- Compose 的版本(V1 或 V2)
- 你需要使用的功能是否支持某个版本
Compose 版本历史速查
init 字段(容器用 tini 初始化)profiles 分组启动服务cpu_count、cpu_percentconfigs、secrets(Swarm)healthcheck.test、depends_on.condition(V2 专属)- 查看
Docker的版本命令docker version - 查看
docker compose的版本命令docker compose version
如果你使用的是 Docker Compose V2(Docker Desktop 2022+ 已默认内置),Compose V2 会自动使用当前 Docker 引擎支持的最新语法,无需手动指定。
建议
- 如果你使用的是 Docker Compose V2(大多数用户),可以 省略
version。 - 如果你需要保持兼容性(比如部署在服务器上),建议使用
version: \"3.9\"。
四、Docker Compose 常用命令速查表
docker compose updocker compose updocker compose up -ddocker compose downdocker compose downdocker compose stopdocker compose stopdocker compose startdocker compose startdocker compose restartdocker compose restartdocker compose builddocker compose builddocker compose pulldocker compose pulldocker compose pushdocker compose pushdocker compose psdocker compose psdocker compose logsdocker compose logs redisdocker compose logs -fdocker compose logs -f appdocker compose execdocker compose exec redis redis-clidocker compose rundocker compose run app npm installdocker compose configdocker compose configdocker compose topdocker compose topdocker compose up
执行此命令,Docker 会在当前目录下查找:
- docker-compose.yml(默认)
- 也支持 docker-compose.yaml(扩展名不同)
如果你用的是默认名称,上述命令就可以直接使用,无需任何参数。
你可以自定义文件名,比如 myapp-compose.yml,然后使用 -f 指定:
docker compose -f myapp-compose.yml up
甚至可以组合多个文件:
docker compose -f docker-compose.yml -f docker-compose.override.yml up
这在区分开发 / 测试 / 生产环境时非常有用。
常见用法建议:
docker-compose.ymldocker-compose.override.ymldocker-compose.prod.ymldocker-compose.dev.ymldocker-compose.test.yml五、实战案例
示例:部署一个 Spring Boot + MySQL + Redis 应用
项目结构
xiaozaoshu/├── docker-compose.yml├── mysql/│ └── init.d/│ ├── 01_sys_config.sql│ └── 02_sys_data.sql├── app/│ ├── Dockerfile│ └── jar/│ └── spring-demo.jar
app/Dockerfile
FROM openjdk:8-jdk-alpineCOPY jar/spring-demo.jar app.jarENTRYPOINT [\"java\", \"-jar\", \"app.jar\"]
docker-compose.yml
services: redis: image: redis:7.2 container_name: xiaozaoshu-redis networks: - docker-backend-network ports: - \"16379:6379\" command: [\"redis-server\", \"--requirepass\", \"${REDIS_PASSWORD}\"] # Nacos config nacos: image: xiaozaoshu-nacos:v1 container_name: xiaozaoshu-nacos networks: - docker-backend-network ports: - \"18848:8848\" - \"9848:9848\" environment: - MODE=standalone volumes: - ./nacos/data:/home/nacos/data # ✅ 数据.久化 depends_on: - mysql restart: unless-stopped # MySQL config mysql: image: mysql:5.7 container_name: xiaozaoshu-mysql networks: - docker-backend-network ports: - \"13306:3306\" environment: - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD} # 从 .env 读取密码 volumes: - ./mysql/data:/var/lib/mysql # 数据持久化 - ./mysql/log:/var/log/mysql # 日志挂载 - ./mysql/conf:/etc/mysql/conf.d # 自定义配置 - ./mysql/init.d:/docker-entrypoint-initdb.d # 初始化脚本(*.sql) 脚本会按照文件名称排序后一次执行 restart: unless-stopped xiaozaoshu-system: image: xiaozaoshu-system-shanghai:v1 container_name: xiaozaoshu-system networks: - docker-backend-network extra_hosts: - \"test-xiaozaoshu.com.cn:192.168.2.100\" ports: - \"8181:8181\" environment: NACOS_PASSWORD: 123@Qwe NACOS_HOST: test-xiaozaoshu.com.cn NACOS_PORT: 18848 depends_on: - nacos entrypoint: [\"/wait-for-nacos.sh\"] command: [\"java\", \"-jar\", \"app.jar\"] restart: unless-stoppednetworks: docker-backend-network: external: true
由于 Docker 的 docker-entrypoint-initdb.d/ 目录中脚本是按照 文件名字典序(ASCII 排序) 自动执行的,需要通过 重命名文件 的方式来确保执行顺序。
启动项目
docker compose up -d
项目将自动启动:
- Spring Boot 应用运行在
test-xiaozaoshu.com.cn:8181 - MySQL 在
localhost:13306 - Redis 在
localhost:16379
六、进阶用法
1. .env 配置环境变量
可以写在 .env 文件中:
MYSQL_ROOT_PASSWORD=123456
然后在 compose 文件中使用:
environment: - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD} # 从 .env 读取密码
2. 多个 Compose 文件组合部署(如:测试环境)
docker compose -f docker-compose.yml -f docker-compose.test.yml up
3. 自动重启策略
restart: unless-stopped
七、常见问题排查
- 启动依赖问题
depends-on 只能保证顺序启动,不能保证nacos 已经可以启动完成可以正常提供服务了,所以增加了 wait-for-nacos.sh,监测nacos服务的状态。
entrypoint: [“/wait-for-nacos.sh”, “java”, “-jar”, “app.jar”]
最初使用上述配置编写Dockerfile,可能被忽略或合并不当,导致直接逃过了监测,直接启动应用,所以在镜像中不要定义默认的 ENTRYPOINT,或 用 Compose 的 command 明确指定启动命令。
entrypoint: [“/wait-for-nacos.sh”]
command: [“java”, “-jar”, “app.jar”]
在 Linux 或 macOS 下,环境变量名称(即变量名)不能以点号 (.) 开头,也不能包含点号,这是 POSIX 标准规定的。
- 环境变量名规则问题
- 只能包含:
字母、数字、下划线(不能包含.) - 必须以 字母或下划线 开头
- 变量名区分大小写
- 只能包含:
以下变量名是非法的:
nacos.password=abc # 错误:包含点号
正确做法(示例):
你可以用下划线 _ 代替点号:
NACOS_PASSWORD: 1234qweR
Spring Boot 支持将 NACOS_PASSWORD 映射为配置属性 nacos.password。
例如你可以在 Spring Boot 中这样读取:
nacos: password: ${NACOS_PASSWORD}
八、卸载 Docker Compose
如果是手动安装的,可以删除:
rm ~/.docker/cli-plugins/docker-compose
九、总结
docker-compose.yml 可轻松复制部署

