网站公告

本次更新:没啥更新的

“钱塘江上潮信起,今日方知我是我”

Skip to content

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 应用:

yaml
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 文件定义了两个服务:

服务作用主要配置
mysqlMySQL 数据库使用 MySQL 镜像、设置密码、挂载数据目录
webWeb 应用根据 Dockerfile 构建镜像,并映射 8090 端口

执行:

bash
docker compose up -d

Docker Compose 就会根据配置统一创建并启动这些服务。

services 下的 mysql、web 表示服务名称(Service Name),同一 Compose 网络中的其他服务可以通过服务名访问它们。

Docker 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 服务启动

例如:

yaml
services:
  mysql:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: 123456
    ports:
      - "3306:3306"
    volumes:
      - /tmp/mysql/data:/var/lib/mysql

大致相当于:

bash
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,命令形式为:

bash
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 构建项目镜像

最常用的两个命令:

bash
# 后台启动整个项目
docker compose up -d

# 停止并删除整个项目
docker compose down

旧版教程中经常看到:

bash
docker-compose up -d

这是 Docker Compose V1 的写法。

现在通常使用:

bash
docker compose up -d

4. 微服务项目部署 ​

下面以一个简单的 cloud-demo 微服务项目为例,通过 Docker Compose 一次启动:

text
Nacos
MySQL
User Service
Order Service
Gateway

整体部署过程:

text
Java 项目源码
      ↓
Maven 打包
      ↓
各服务 app.jar
      ↓
Dockerfile
      ↓
构建服务镜像
      ↓
docker-compose.yml
      ↓
docker compose up -d
      ↓
一次启动整个项目

4.1 项目结构 ​

项目部署目录大致如下:

text
cloud-demo/
│
├── docker-compose.yml
│
├── mysql/
│   ├── data/
│   └── conf/
│
├── user-service/
│   ├── Dockerfile
│   └── app.jar
│
├── order-service/
│   ├── Dockerfile
│   └── app.jar
│
└── gateway/
    ├── Dockerfile
    └── app.jar

cloud-demo 项目目录

Compose 文件负责描述整个项目,而每个 Java 微服务通过自己的 Dockerfile 构建镜像。


4.2 编写 Compose 文件 ​

docker-compose.yml:

yaml
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 端口

例如:

yaml
build: ./user-service

表示 Docker Compose 会使用:

text
./user-service

目录作为构建上下文,并根据其中的 Dockerfile 构建镜像。


4.3 配置服务间通信 ​

Docker Compose 默认会为同一个项目中的服务创建网络。

处于同一个 Compose 网络中的服务,可以直接通过 服务名称 相互访问,因此通常不需要写死容器 IP。

例如:

yaml
services:
  mysql:
  nacos:
  orderservice:

那么 orderservice 可以通过:

text
mysql:3306

访问 MySQL,通过:

text
nacos:8848

访问 Nacos。

Spring Boot 配置示例:

yaml
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

其中:

text
mysql
nacos

都是 Compose 文件中定义的服务名称。

Compose 网络中优先通过服务名进行服务发现,而不是依赖可能发生变化的容器 IP。


4.4 打包微服务 ​

使用 Maven 将每个 Java 微服务打包为 JAR 文件。

由于后面的 Dockerfile 中统一使用:

text
app.jar

因此可以在 Maven 中设置最终打包名称:

xml
<build>
    <finalName>app</finalName>

    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

执行:

bash
mvn clean package

打包后生成:

text
app.jar

Maven 打包结果


4.5 准备 Dockerfile ​

每个微服务目录中准备:

text
Dockerfile
app.jar

User Service:

text
user-service/
├── Dockerfile
└── app.jar

User Service 部署目录

Order Service:

text
order-service/
├── Dockerfile
└── app.jar

Order Service 部署目录

Gateway:

text
gateway/
├── Dockerfile
└── app.jar

Gateway 部署目录

Dockerfile 示例:

dockerfile
FROM java:8-alpine

COPY ./app.jar /tmp/app.jar

ENTRYPOINT ["java", "-jar", "/tmp/app.jar"]

Gateway Dockerfile

Order Service Dockerfile

User Service Dockerfile

这里沿用原项目的 Java 8 示例。实际项目应根据自己使用的 JDK 版本选择对应的基础镜像。


4.6 部署项目 ​

所有文件准备完成后,将整个 cloud-demo 目录上传到服务器。

进入项目目录:

bash
cd cloud-demo

执行:

bash
docker compose up -d

Docker Compose 会根据配置完成:

text
读取 docker-compose.yml
          ↓
拉取需要的镜像
          ↓
构建 Java 服务镜像
          ↓
创建 Compose 网络
          ↓
创建各服务容器
          ↓
启动所有服务

其中:

bash
-d

表示后台运行。


4.7 查看运行状态 ​

查看当前 Compose 项目的服务状态:

bash
docker compose ps

查看所有服务日志:

bash
docker compose logs

持续查看日志:

bash
docker compose logs -f

只查看 Gateway:

bash
docker compose logs -f gateway

暂时停止所有服务:

bash
docker compose stop

重新启动:

bash
docker compose start

停止并删除 Compose 创建的容器和网络:

bash
docker compose down

5. 小结 ​

Docker Compose 的核心作用,就是通过一个 YAML 文件统一管理一组相关容器。

可以简单理解为:

text
docker-compose.yml
        │
        ├── mysql
        ├── nacos
        ├── userservice
        ├── orderservice
        └── gateway

Compose 文件主要描述:

text
需要哪些服务
      ↓
使用哪些镜像
      ↓
映射哪些端口
      ↓
配置哪些环境变量
      ↓
挂载哪些数据
      ↓
服务之间如何通信

最常用命令:

bash
# 启动整个项目
docker compose up -d

# 查看运行状态
docker compose ps

# 查看实时日志
docker compose logs -f

# 停止并删除项目
docker compose down

可以简单记住:

Dockerfile 解决“一个镜像怎么构建”,Docker Compose 解决“一组容器怎么统一运行和管理”。

Noctiflorous Garden · MIT License