一、Docker-Compose是什么

Docker-Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。通过 YAML 文件配置应用的服务、网络和卷,实现一键启动、停止和管理容器化应用的依赖关系。

核心功能

  • 多容器编排:通过单一配置文件管理多个容器及其依赖关系。
  • 服务定义:使用 docker-compose.yml 文件定义服务、镜像、端口映射、环境变量等。
  • 一键操作:通过命令行工具执行容器组的启动、停止、重建等操作。

典型应用场景

  • 开发环境快速搭建,例如同时启动数据库、后端和前端服务。
  • 测试环境中模拟生产环境的依赖服务。
  • 微服务架构中管理服务间的连接与配置。

基础命令示例

# 启动所有服务(后台运行)
docker-compose up -d

# 停止并移除容器
docker-compose down

# 查看服务状态
docker-compose ps

优势与局限

  • 优势:简化多容器管理,配置文件可版本化,与 Docker 生态无缝集成。
  • 局限:适用于本地开发和测试,生产环境建议使用 Kubernetes 等更强大的编排工具。

版本兼容性

Docker-Compose 与 Docker 引擎版本需匹配。建议使用 version: '3' 及以上配置语法以支持最新功能。

二、从零构建spring boot应用

1、服务器目录结构规划
/deploy/
├── docker-compose.yml          # 主编排文件(用于编排业务相关服务)
├── docker-compose-data.yml     # 主编排文件(用于编排mysql、redis、nacos相关服务)
├── .env                        # 环境变量配置文件
├── services/                   # 各微服务构建上下文
│   ├── auth/
│   │   ├── auth-service.jar    # Spring Boot 编译后的 JAR 包
│   │   └── Dockerfile          # 构建镜像用
│   ├── gateway/
│   │   ├── gateway-service.jar
│   │   └── Dockerfile
│   ├── server/
│   │   ├── server-service.jar
│   │   └── Dockerfile
│   └── client/
│       └── dist/               # 前端静态资源(Vue/React 打包后)
├── mysql-data/                 # MySQL 数据持久化目录
├── redis-data/                 # redis 数据持久化目录
├── nacos-data/                 # redis 数据持久化目录
│── logs/                       # 容器日志挂载目录(可选)

创建目录:

mkdir -p /deploy/services/{auth,gateway,server,client} /deploy/{mysql-data,redis-data,logs,nacos-data}
2、每个服务的 Dockerfile

通用模板(适用于所有 Spring Boot 服务) 所有服务都使用 openjdk:8-jre-slim 镜像,轻量且兼容 JDK 8。

权限服务:/deploy/services/auth/Dockerfile

# 使用 OpenJDK 8 JRE 轻量镜像
FROM openjdk:8-jre-slim

# 设置工作目录
WORKDIR /app

# 复制 JAR 文件(注意:文件名需与实际一致)
COPY auth-service.jar app.jar

# 暴露服务端口(auth 服务通常用 8081)
EXPOSE 8081

# 启动命令
ENTRYPOINT ["java", "-jar", "app.jar"]

网关服务:/deploy/services/gateway/Dockerfile

FROM openjdk:8-jre-slim
WORKDIR /app
COPY gateway-service.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]

业务服务:/deploy/services/server/Dockerfile

FROM openjdk:8-jre-slim
WORKDIR /app
COPY server-service.jar app.jar
EXPOSE 8082
ENTRYPOINT ["java", "-jar", "app.jar"]

⚠️ 注意: 确保 COPY 的 JAR 文件名与你实际上传的一致 如果你的 JAR 文件包含版本号(如 auth-service-1.0.jar),请相应修改

3、编排文件

由于整个应用在整个项目的生命周期中,部分服务会经常的更新和构建,比如业务相关服务,部分服务会一直处于不更新的状态,比如数据库,中间件等,为了避免频繁构建的时候,带来其他不必要的麻烦,将两种类型的服务放在两个文件中进行构建;

3.1、docker-compose.yml(构建业务相关的服务)
# Docker Compose 版本声明
version: '3.8'

# 定义服务集合
services:
  # Nacos 服务
  nacos:
    image: nacos/nacos-server:v2.4.1
    container_name: nacos-server
    ports:
      - "8848:8848"
    environment:
      MODE: standalone
      SPRING_PROFILES_ACTIVE: standalone
      NACOS_LOG_LEVEL: info
    volumes:
      - nacos-data:/home/nacos/data
      - nacos-logs:/home/nacos/logs
    restart: unless-stopped

  # API 网关服务
  gateway:
    build: ./services/gateway
    image: gateway-service:1.0
    container_name: gateway-service
    ports:
      - "16000:16000"
    depends_on:
      - nacos
    restart: unless-stopped

  # 认证服务
  auth:
    build: ./services/auth
    image: auth-service:1.0
    container_name: auth-service
    ports:
      - "15000:15000"
    depends_on:
      - nacos
    restart: unless-stopped

  # 业务服务1
  server:
    build: ./services/server
    image: server-service:1.0
    container_name: server-service
    ports:
      - "17001:17001"
    environment:
      - AUTH_SERVICE_URL=http://auth:15000
    depends_on:
      - nacos
    restart: unless-stopped

  # 业务服务2
  client:
    build: ./services/client
    image: client-service:1.0
    container_name: client-service
    ports:
      - "17002:17002"
    environment:
      - AUTH_SERVICE_URL=http://auth:15000
    depends_on:
      - nacos
    restart: unless-stopped

# 定义数据卷
volumes:
  nacos-data:
  nacos-logs:
3.2、docker-compose-data.yml(不长更新的相关服务,名字随便起)
# Docker Compose 版本声明
version: '3.8'

# 定义服务集合
services:
  # Redis 服务
  redis:
    image: redis:7.2
    container_name: redis
    ports:
      - "6379:6379"
    volumes:
      - redis-data:/data
    restart: unless-stopped

  # MySQL 数据库服务
  mysql:
    image: mysql:5.7
    container_name: mysql
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_USER: ${MYSQL_USER}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}
      MYSQL_DATABASE: mydatabase
    ports:
      - "3306:3306"
    volumes:
      - mysql-data:/var/lib/mysql
    restart: unless-stopped


# 定义数据卷
volumes:
  mysql-data:
  redis-data:

4、创建 .env 环境变量文件
MYSQL_ROOT_PASSWORD=123456
MYSQL_USER=root
MYSQL_PASSWORD=123456

✅ 优点: 避免密码硬编码 docker-compose 自动加载 .env 文件

5、部署操作流程(Linux 服务器上执行)

步骤 1:上传文件

  • 将以下文件上传到 /deploy 目录:
  • 所有 JAR 文件(auth-service.jar 等上传到对应的路径)
  • 每个服务的 Dockerfile
  • docker-compose.yml
  • .env
  • (可选)前端 dist 文件夹

建议采用工具来上传文件,个人推荐 MobaXterm

步骤 2:进入部署目录

cd /deploy

步骤 3:首次构建并启动所有服务

# 先构建数据库,中间件服务,避免后面的应用在启动的时候有依赖,起不起来
docker-compose up -d --build

# 构建业务相关(如果不是标准的 docker-compose.yml,则需要指定对应的编排文件)
docker-compose -f docker-compose-data.yml up -d --build

--build:首次必须使用,构建所有服务镜像
-f 指定的编排文件

步骤 4:查看服务状态

docker-compose ps

输出应类似:

Name                 Command             State           Ports
-----------------------------------------------------------------------
auth-service       java -jar app.jar    Up              0.0.0.0:8081->8081/tcp
gateway-service    java -jar app.jar    Up              0.0.0.0:8080->8080/tcp
mysql-db           docker-entrypoint.sh Up              0.0.0.0:3306->3306/tcp
...

步骤 5:查看日志

# 查看某个服务日志
docker-compose logs auth
docker-compose logs gateway

# 实时查看
docker-compose logs -f server
6、更新某个服务(如更新 auth-service)
# 1. 替换新 JAR
cp /path/to/new/auth-service.jar ./services/auth/auth-service.jar

# 2. 重新构建并启动 auth 服务
docker-compose up -d --build auth
7、服务间调用说明(JDK 8 环境下)
8、验证部署成功
验证项命令
所有服务运行中docker-compose ps
网关健康检查curl http://localhost:8080/actuator/health
认证服务健康curl http://localhost:8081/actuator/health
数据库持久化docker volume inspect mysql-data
查看 MySQL 数据docker exec -it mysql mysql -root -p

🛡️ 生产建议(JDK 8 环境)

建议说明
✅ 使用 jre-slim 而非 jdk更小镜像,适合生产
✅ 添加 JVM 参数如 -Xms512m -Xmx1g 到 ENTRYPOINT
✅ 定期备份 mysql-data防止数据丢失
✅ 使用 Nginx + HTTPS对外暴露 443,反向代理到 8080
✅ 日志挂载- ./logs:/app/logs

注意:如果docker-compose版本过高,则构建服务的命令为:中间没有 ‘-’ 符号

# 先构建数据库,中间件服务,避免后面的应用在启动的时候有依赖,起不起来
docker compose up -d --build

# 构建业务相关(如果不是标准的 docker-compose.yml,则需要指定对应的编排文件)
docker compose -f docker-compose-data.yml up -d --build

--build:首次必须使用,构建所有服务镜像
-f 指定的编排文件

更多推荐