跳到主要内容

Docker 容器化

概述

项目提供 Docker Compose 编排方案,一键部署完整的后端服务、数据库和缓存环境。编排文件位于 script/docker/ 目录。

文件结构

script/docker/
├── docker-compose.yml # 服务编排配置
├── docker.env # 环境变量配置
├── Docker-HOWTO.md # 构建说明
├── yudao-server/
│ └── Dockerfile # 后端服务镜像
└── yudao-ui-admin/
├── Dockerfile # 管理后台前端镜像
├── .dockerignore # 构建排除文件
└── nginx.conf # 容器内 Nginx 配置

服务定义

服务清单

服务容器名镜像端口映射说明
MySQLyudao-mysqlmysql:83306:3306数据库
Redisyudao-redisredis:6-alpine6379:6379缓存
Serveryudao-serveryudao-server(构建)48080:48080后端 API
Adminyudao-adminyudao-admin(构建)8080:80管理后台前端

MySQL 服务

mysql:
container_name: yudao-mysql
image: mysql:8
restart: unless-stopped
tty: true
ports:
- "3306:3306"
environment:
MYSQL_DATABASE: ${MYSQL_DATABASE:-ruoyi-vue-pro}
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-123456}
volumes:
- mysql:/var/lib/mysql/
- ../../sql/mysql/ruoyi-vue-pro.sql:/docker-entrypoint-initdb.d/ruoyi-vue-pro.sql:ro

关键点

  • 首次启动自动执行 ruoyi-vue-pro.sql 初始化数据库
  • 数据持久化到 mysql 命名卷
  • 默认数据库名 ruoyi-vue-pro,密码 123456

Redis 服务

redis:
container_name: yudao-redis
image: redis:6-alpine
restart: unless-stopped
ports:
- "6379:6379"
volumes:
- redis:/data

使用 Alpine 轻量镜像,数据持久化到 redis 命名卷。

后端服务

server:
container_name: yudao-server
build:
context: ./yudao-server/
image: yudao-server
restart: unless-stopped
ports:
- "48080:48080"
environment:
SPRING_PROFILES_ACTIVE: local
JAVA_OPTS: ${JAVA_OPTS:--Xms512m -Xmx512m}
ARGS:
--spring.datasource.dynamic.datasource.master.url=jdbc:mysql://yudao-mysql:3306/...
--spring.redis.host=yudao-redis
depends_on:
- mysql
- redis

关键点

  • 通过 depends_on 确保 MySQL 和 Redis 先启动
  • 数据源地址使用容器名 yudao-mysql 作为主机名
  • Redis 地址使用容器名 yudao-redis
  • JVM 默认参数:堆内存 512MB

管理后台前端

admin:
container_name: yudao-admin
build:
context: ./yudao-ui-admin
args:
NODE_ENV: ${NODE_ENV:-production}
VUE_APP_BASE_API: ${VUE_APP_BASE_API:-/prod-api}
VUE_APP_TITLE: ${VUE_APP_TITLE:-芋道管理系统}
image: yudao-admin
restart: unless-stopped
ports:
- "8080:80"
depends_on:
- server

环境变量配置

docker.env 文件定义了所有可配置的环境变量:

## MySQL
MYSQL_DATABASE=ruoyi-vue-pro
MYSQL_ROOT_PASSWORD=123456

## 后端 JVM 参数
JAVA_OPTS=-Xms512m -Xmx512m -Djava.security.egd=file:/dev/./urandom

## 主数据源
MASTER_DATASOURCE_URL=jdbc:mysql://yudao-mysql:3306/${MYSQL_DATABASE}?useSSL=false&serverTimezone=Asia/Shanghai
MASTER_DATASOURCE_USERNAME=root
MASTER_DATASOURCE_PASSWORD=${MYSQL_ROOT_PASSWORD}

## 从数据源(默认与主数据源相同)
SLAVE_DATASOURCE_URL=${MASTER_DATASOURCE_URL}
SLAVE_DATASOURCE_USERNAME=${MASTER_DATASOURCE_USERNAME}
SLAVE_DATASOURCE_PASSWORD=${MASTER_DATASOURCE_PASSWORD}

## Redis
REDIS_HOST=yudao-redis

## 前端构建参数
NODE_ENV=production
VUE_APP_BASE_API=/prod-api
VUE_APP_TITLE=芋道管理系统
VUE_APP_TENANT_ENABLE=true
VUE_APP_CAPTCHA_ENABLE=true

构建与启动

前置条件

  • Docker Engine 20.10+
  • Docker Compose v2(支持 docker compose 命令)

步骤一:构建 JAR 包

使用 Maven Docker 镜像编译后端代码:

# 创建 Maven 缓存卷
docker volume create --name yudao-maven-repo

# 编译打包
docker run -it --rm --name yudao-maven \
-v yudao-maven-repo:/root/.m2 \
-v $PWD:/usr/src/mymaven \
-w /usr/src/mymaven \
maven mvn clean install package '-Dmaven.test.skip=true'

步骤二:启动所有服务

docker compose --env-file docker.env up -d

首次运行会自动构建所有容器镜像。

常用命令

# 查看服务状态
docker compose ps

# 查看日志
docker compose logs -f server

# 重新构建某个服务
docker compose build server

# 停止所有服务
docker compose down

# 停止并清除数据卷(慎用,会删除数据库数据)
docker compose down -v

端口映射汇总

服务访问地址
管理后台 UIhttp://localhost:8080
后端 APIhttp://localhost:48080
MySQLlocalhost:3306(root/123456)
Redislocalhost:6379

数据持久化

卷名用途
mysqlMySQL 数据文件
redisRedis 持久化数据

注意事项

  1. 生产环境:务必修改 MySQL 默认密码和 Redis 无密码访问
  2. 数据备份:定期备份 MySQL 数据卷
  3. JVM 调优:根据服务器内存调整 JAVA_OPTS 中的 -Xms-Xmx
  4. 网络:容器间通过 Docker 内部网络通信,使用容器名作为主机名
  5. 日志:通过 docker compose logs 查看各服务日志

Docker����

���ĵ����ڽ����У������ڴ���