Docker Compose
字数: 0 字 时长: 0 分钟
1. Docker Compose 概述
平时使用 Docker 时,如果一个项目只有一个容器,直接使用 docker run 就可以完成启动。
但实际项目往往不止一个容器,例如可能同时需要:
- MySQL
- Redis
- Nginx
- Java 应用
- Nacos
- 消息队列等
如果每个容器都手动执行一条 docker run 命令,不仅操作麻烦,而且端口、环境变量、数据卷、网络等配置也不方便统一管理。
Docker Compose 就是用来解决这个问题的。
它可以把多个服务的镜像、端口、环境变量、数据卷、网络等配置统一写在一个 Compose 文件中,然后通过一条命令完成整个项目的创建、启动和管理。
简单来说:
docker run适合启动单个容器,Docker Compose 适合统一管理一组相关容器。
2. Compose 文件
Compose 文件本质上是一个 YAML 配置文件,用来描述一个项目中需要运行哪些服务,以及这些服务应该如何运行。
可以简单理解为:
Compose 文件就是把原本需要执行的多条
docker run命令,统一写到一个 YAML 文件中进行管理。
例如,一个项目同时需要 MySQL 和 Web 应用:
services:
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: 123456
volumes:
- /tmp/mysql/data:/var/lib/mysql
web:
build: .
ports:
- "8090:8090"
depends_on:
- mysql上面的 Compose 文件定义了两个服务:
| 服务 | 作用 | 主要配置 |
|---|---|---|
mysql | MySQL 数据库 | 使用 MySQL 镜像、设置密码、挂载数据目录 |
web | Web 应用 | 根据 Dockerfile 构建镜像,并映射 8090 端口 |
执行:
docker compose up -dDocker Compose 就会根据配置统一创建并启动这些服务。
services下的mysql、web表示服务名称(Service Name),同一 Compose 网络中的其他服务可以通过服务名访问它们。

2.1 Compose 常用配置
Compose 文件中常见的配置项如下:
| 配置 | 作用 | 人话理解 |
|---|---|---|
services | 定义项目中的服务 | 这个项目需要启动哪些东西 |
image | 指定镜像 | 这个服务使用哪个镜像 |
build | 根据 Dockerfile 构建镜像 | 不使用现成镜像,自己构建 |
ports | 设置端口映射 | 对应 docker run -p |
environment | 设置环境变量 | 对应 docker run -e |
volumes | 设置数据挂载 | 对应 docker run -v |
networks | 配置网络 | 控制服务之间的网络连接 |
depends_on | 声明服务启动顺序依赖 | 例如 Web 服务先依赖 MySQL 服务启动 |
例如:
services:
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: 123456
ports:
- "3306:3306"
volumes:
- /tmp/mysql/data:/var/lib/mysql大致相当于:
docker run \
--name mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-p 3306:3306 \
-v /tmp/mysql/data:/var/lib/mysql \
-d \
mysql:8.0因此可以简单理解:
Compose 并没有改变 Docker 的基本运行方式,而是把多个容器的配置集中到一个文件中统一管理。
3. Docker Compose 常用命令
现在通常使用 Docker Compose V2,命令形式为:
docker compose [COMMAND]常见命令如下:
| 命令 | 作用 | 人话理解 |
|---|---|---|
docker compose up -d | 创建并后台启动服务 | 把整个项目启动起来 |
docker compose down | 停止并删除容器和网络 | 把整个项目停掉并清理 |
docker compose ps | 查看服务状态 | 看各个服务有没有正常运行 |
docker compose logs | 查看服务日志 | 看整个项目的日志 |
docker compose logs -f | 持续查看日志 | 实时追踪日志 |
docker compose stop | 停止服务 | 只停止,不删除容器 |
docker compose start | 启动已停止的服务 | 把服务重新启动 |
docker compose restart | 重启服务 | 重新启动服务 |
docker compose pull | 拉取镜像 | 更新服务使用的镜像 |
docker compose build | 构建镜像 | 根据 Dockerfile 构建项目镜像 |
最常用的两个命令:
# 后台启动整个项目
docker compose up -d
# 停止并删除整个项目
docker compose down旧版教程中经常看到:
docker-compose up -d这是 Docker Compose V1 的写法。
现在通常使用:
docker compose up -d4. 微服务项目部署
下面以一个简单的 cloud-demo 微服务项目为例,通过 Docker Compose 一次启动:
Nacos
MySQL
User Service
Order Service
Gateway整体部署过程:
Java 项目源码
↓
Maven 打包
↓
各服务 app.jar
↓
Dockerfile
↓
构建服务镜像
↓
docker-compose.yml
↓
docker compose up -d
↓
一次启动整个项目4.1 项目结构
项目部署目录大致如下:
cloud-demo/
│
├── docker-compose.yml
│
├── mysql/
│ ├── data/
│ └── conf/
│
├── user-service/
│ ├── Dockerfile
│ └── app.jar
│
├── order-service/
│ ├── Dockerfile
│ └── app.jar
│
└── gateway/
├── Dockerfile
└── app.jar
Compose 文件负责描述整个项目,而每个 Java 微服务通过自己的 Dockerfile 构建镜像。
4.2 编写 Compose 文件
docker-compose.yml:
services:
nacos:
image: nacos/nacos-server
environment:
MODE: standalone
ports:
- "8848:8848"
mysql:
image: mysql:8.0.30
environment:
MYSQL_ROOT_PASSWORD: 123
volumes:
- "$PWD/mysql/data:/var/lib/mysql"
- "$PWD/mysql/conf:/etc/mysql/conf.d/"
userservice:
build: ./user-service
orderservice:
build: ./order-service
gateway:
build: ./gateway
ports:
- "10010:10010"该文件定义了 5 个服务:
| 服务 | 作用 | 主要配置 |
|---|---|---|
nacos | 注册中心、配置中心 | 使用 Nacos 镜像,以单机模式启动 |
mysql | 数据库 | 使用 MySQL 8.0.30,并挂载数据和配置目录 |
userservice | 用户服务 | 根据 user-service/Dockerfile 构建 |
orderservice | 订单服务 | 根据 order-service/Dockerfile 构建 |
gateway | 网关服务 | 根据 Dockerfile 构建,并暴露 10010 端口 |
例如:
build: ./user-service表示 Docker Compose 会使用:
./user-service目录作为构建上下文,并根据其中的 Dockerfile 构建镜像。
4.3 配置服务间通信
Docker Compose 默认会为同一个项目中的服务创建网络。
处于同一个 Compose 网络中的服务,可以直接通过 服务名称 相互访问,因此通常不需要写死容器 IP。
例如:
services:
mysql:
nacos:
orderservice:那么 orderservice 可以通过:
mysql:3306访问 MySQL,通过:
nacos:8848访问 Nacos。
Spring Boot 配置示例:
spring:
datasource:
url: jdbc:mysql://mysql:3306/cloud_order?useSSL=false
username: root
password: 123
driver-class-name: com.mysql.cj.jdbc.Driver
application:
name: orderservice
cloud:
nacos:
server-addr: nacos:8848其中:
mysql
nacos都是 Compose 文件中定义的服务名称。
Compose 网络中优先通过服务名进行服务发现,而不是依赖可能发生变化的容器 IP。
4.4 打包微服务
使用 Maven 将每个 Java 微服务打包为 JAR 文件。
由于后面的 Dockerfile 中统一使用:
app.jar因此可以在 Maven 中设置最终打包名称:
<build>
<finalName>app</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>执行:
mvn clean package打包后生成:
app.jar
4.5 准备 Dockerfile
每个微服务目录中准备:
Dockerfile
app.jarUser Service:
user-service/
├── Dockerfile
└── app.jar
Order Service:
order-service/
├── Dockerfile
└── app.jar
Gateway:
gateway/
├── Dockerfile
└── app.jar
Dockerfile 示例:
FROM java:8-alpine
COPY ./app.jar /tmp/app.jar
ENTRYPOINT ["java", "-jar", "/tmp/app.jar"]


这里沿用原项目的 Java 8 示例。实际项目应根据自己使用的 JDK 版本选择对应的基础镜像。
4.6 部署项目
所有文件准备完成后,将整个 cloud-demo 目录上传到服务器。
进入项目目录:
cd cloud-demo执行:
docker compose up -dDocker Compose 会根据配置完成:
读取 docker-compose.yml
↓
拉取需要的镜像
↓
构建 Java 服务镜像
↓
创建 Compose 网络
↓
创建各服务容器
↓
启动所有服务其中:
-d表示后台运行。
4.7 查看运行状态
查看当前 Compose 项目的服务状态:
docker compose ps查看所有服务日志:
docker compose logs持续查看日志:
docker compose logs -f只查看 Gateway:
docker compose logs -f gateway暂时停止所有服务:
docker compose stop重新启动:
docker compose start停止并删除 Compose 创建的容器和网络:
docker compose down5. 小结
Docker Compose 的核心作用,就是通过一个 YAML 文件统一管理一组相关容器。
可以简单理解为:
docker-compose.yml
│
├── mysql
├── nacos
├── userservice
├── orderservice
└── gatewayCompose 文件主要描述:
需要哪些服务
↓
使用哪些镜像
↓
映射哪些端口
↓
配置哪些环境变量
↓
挂载哪些数据
↓
服务之间如何通信最常用命令:
# 启动整个项目
docker compose up -d
# 查看运行状态
docker compose ps
# 查看实时日志
docker compose logs -f
# 停止并删除项目
docker compose down可以简单记住:
Dockerfile 解决“一个镜像怎么构建”,Docker Compose 解决“一组容器怎么统一运行和管理”。