当前位置: 首页 > news >正文

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-compose
chmod +x ~/.docker/cli-plugins/docker-compose
docker 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@qwerredis:image: redis:7.2container_name: xiaozaoshu-redisports:- "16379:6379"

关键字段解释

字段含义
versionCompose 文件版本
services定义多个服务,每个服务类似一个 docker run 容器
image使用的镜像
build指定 Dockerfile 构建镜像
ports端口映射:宿主机:容器
volumes挂载卷(主机路径:容器路径)
environment设置环境变量
depends_on设置服务间依赖关系
networks指定服务所属网络(用于服务间通信)

version

Docker Compose 文件的 语法版本(Compose File Format),用于指定当前 YAML 文件使用的是哪一套规则。

Compose 文件的版本取决于你所使用的:

  1. Docker Engine 的版本
  2. Compose 的版本(V1 或 V2)
  3. 你需要使用的功能是否支持某个版本

Compose 版本历史速查

Version新增特性
3.9支持 init 字段(容器用 tini 初始化)
3.8支持 profiles 分组启动服务
3.7支持 cpu_countcpu_percent
3.4 ~ 3.6添加 configssecrets(Swarm)
2.4支持 healthcheck.testdepends_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 up构建并启动所有服务docker compose up
docker compose up -d后台运行(detach 模式)✅ 推荐用于开发
docker compose down停止并删除所有容器、网络、匿名卷docker compose down
docker compose stop停止服务,但不删除容器docker compose stop
docker compose start启动已停止的服务容器docker compose start
docker compose restart重启所有服务docker compose restart
docker compose build手动构建服务镜像docker compose build
docker compose pull拉取最新镜像docker compose pull
docker compose push推送镜像到远程仓库docker compose push
docker compose ps查看服务容器状态docker compose ps
docker compose logs查看日志docker compose logs redis
docker compose logs -f实时追踪日志docker compose logs -f app
docker compose exec在容器中执行命令(支持交互)docker compose exec redis redis-cli
docker compose run启动一个一次性容器运行命令docker compose run app npm install
docker compose config查看合并后的配置(调试用)docker compose config
docker compose top查看容器的进程信息docker compose top

docker 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.yml默认配置,推荐统一使用
docker-compose.override.yml默认自动合并(可选)
docker-compose.prod.yml生产环境配置
docker-compose.dev.yml本地开发配置
docker-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-alpine
COPY jar/spring-demo.jar app.jar
ENTRYPOINT ["java", "-jar", "app.jar"]
docker-compose.yml

services:redis:image: redis:7.2container_name: xiaozaoshu-redisnetworks:- docker-backend-networkports:- "16379:6379"command: ["redis-server", "--requirepass", "${REDIS_PASSWORD}"]# Nacos confignacos:image: xiaozaoshu-nacos:v1container_name: xiaozaoshu-nacosnetworks:- docker-backend-networkports:- "18848:8848"- "9848:9848"environment:- MODE=standalonevolumes:- ./nacos/data:/home/nacos/data  # ✅ 数据.久化depends_on:- mysqlrestart: unless-stopped# MySQL configmysql:image: mysql:5.7container_name: xiaozaoshu-mysqlnetworks:- docker-backend-networkports:- "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-stoppedxiaozaoshu-system:image: xiaozaoshu-system-shanghai:v1container_name: xiaozaoshu-systemnetworks:- docker-backend-networkextra_hosts:- "test-xiaozaoshu.com.cn:192.168.2.100"ports:- "8181:8181"environment:NACOS_PASSWORD: 123@QweNACOS_HOST: test-xiaozaoshu.com.cnNACOS_PORT: 18848depends_on:- nacosentrypoint: ["/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”]

LinuxmacOS 下,环境变量名称(即变量名)不能以点号 (.) 开头,也不能包含点号,这是 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 可轻松复制部署
跨平台支持 Linux / Windows / macOS
适合开发快速启动开发环境,模拟微服务系统
http://www.xdnf.cn/news/1157419.html

相关文章:

  • LeetCode 198 打家劫舍 LeetCode 213.打家劫舍II
  • Kotlin函数式接口
  • 力扣:动态规划java
  • kotlin Flow快速学习2025
  • 算法训练营DAY36 第九章 动态规划part04
  • Request和Response相关介绍
  • 数字图像处理(四:图像如果当作矩阵,那加减乘除处理了矩阵,那图像咋变):从LED冬奥会、奥运会及春晚等等大屏,到手机小屏,快来挖一挖里面都有什么
  • 《计算机网络》实验报告三 UDP协议分析
  • STM32-第八节-TIM定时器-4(编码器接口)
  • C++虚函数易错点整理
  • Python dataclass 高阶用法与技巧
  • springboot-profile
  • Direct3D 11学习(一)
  • 数学专业转行做大数据容易吗?需要补什么?
  • Web服务压力测试工具hey学习一:使用方法
  • 如何解决pip安装报错error subprocess-exited-with-error问题
  • 力扣面试150题--搜索插入位置
  • 30天打牢数模基础-灰色预测模型讲解
  • BLIP、InternVL Series(下)
  • Eureka+LoadBalancer实现服务注册与发现
  • JavaScript 对象操作、继承与模块化实现
  • RCE随笔(1)
  • 使用 Pyecharts 绘制精美饼状图:从基础到高级技巧
  • 【LeetCode 热题 100】236. 二叉树的最近公共祖先——DFS
  • Effective Python 条款13:通过带星号的unpacking操作来捕获多个元素,不要用切片
  • 构建一个简单的Java框架来测量并发执行任务的时间
  • 深入浅出理解动态规划
  • The FastMCP Client
  • `tidyverse` 中涉及的函数及其用法
  • 【RAG Agent】Deep Searcher实现逻辑解析