ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Vue3+SpringBoot项目Docker容器化部署实战指南

Vue3+SpringBoot项目Docker容器化部署实战指南

1. 项目概述

最近在技术社区看到不少开发者对Vue3+SpringBoot前后端分离项目的容器化部署存在困惑。作为一个经历过多次完整项目部署的老兵,我想分享下从零开始的Docker化实战经验。这次我们先聚焦环境搭建和数据库容器化这两个基础但关键的环节。

这个教程适合已经掌握Vue3和SpringBoot基础开发,但尚未接触过容器化部署的中级开发者。通过完整的实操演示,你将学会:

  • 如何搭建标准的Docker工作环境
  • 数据库容器化的正确姿势
  • 容器网络配置的核心要点
  • 常见部署问题的解决方案

2. 环境准备与工具选型

2.1 操作系统选择

我推荐使用CentOS 7作为基础系统,原因有三:

  1. 企业级稳定性:CentOS的长期支持版本经过充分验证
  2. 容器友好性:内核版本(3.10+)完全支持Docker所需特性
  3. 文档丰富:遇到问题容易找到解决方案

注意:如果使用Windows系统,建议通过WSL2安装Ubuntu子系统,避免直接使用Docker Desktop可能遇到的兼容性问题

2.2 Docker安装配置

在CentOS上安装Docker的完整步骤:

# 卸载旧版本 sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine # 安装必要工具 sudo yum install -y yum-utils # 设置仓库 sudo yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo # 安装Docker引擎 sudo yum install docker-ce docker-ce-cli containerd.io # 启动Docker sudo systemctl start docker # 验证安装 sudo docker run hello-world

配置镜像加速(解决国内拉取镜像慢的问题):

sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://your-mirror.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker

2.3 开发环境准备

前端开发环境:

  • Node.js 16+ (Vue3官方推荐版本)
  • Vite构建工具
  • Vue CLI(可选)

后端开发环境:

  • JDK 17(SpringBoot 3.x要求)
  • Maven 3.8+
  • IDE推荐IntelliJ IDEA

3. 数据库容器化实战

3.1 MySQL容器部署

使用官方MySQL镜像部署生产级数据库服务:

docker run -d \ --name mysql8 \ -p 3306:3306 \ -e MYSQL_ROOT_PASSWORD=your_secure_password \ -e MYSQL_DATABASE=app_db \ -e MYSQL_USER=app_user \ -e MYSQL_PASSWORD=user_password \ -v /data/mysql:/var/lib/mysql \ --restart unless-stopped \ mysql:8.0 \ --character-set-server=utf8mb4 \ --collation-server=utf8mb4_unicode_ci

关键参数解析:

  • -v:数据卷挂载,确保数据持久化
  • --restart:设置自动重启策略
  • 最后的两个参数设置字符集,避免中文乱码

3.2 Redis容器部署

对于缓存服务Redis,推荐如下配置:

docker run -d \ --name redis \ -p 6379:6379 \ -v /data/redis:/data \ --restart unless-stopped \ redis:6 \ redis-server --appendonly yes --requirepass "your_redis_password"

3.3 容器网络配置

默认的bridge网络存在IP变动问题,建议创建自定义网络:

docker network create app_network

然后将所有相关容器加入同一网络:

docker network connect app_network mysql8 docker network connect app_network redis

这样容器间可以通过容器名直接通信,例如SpringBoot应用的数据库连接URL可以配置为:

jdbc:mysql://mysql8:3306/app_db

4. 常见问题与解决方案

4.1 容器时区问题

Docker容器默认使用UTC时区,解决方式:

# 创建容器时加入时区参数 -e TZ=Asia/Shanghai -v /etc/localtime:/etc/localtime:ro

4.2 数据库性能优化

对于生产环境MySQL容器,建议调整以下参数:

--innodb_buffer_pool_size=1G \ --innodb_log_file_size=256M \ --max_connections=200

4.3 容器资源限制

避免单个容器占用全部资源:

--memory=2g \ --cpus=2

5. 安全加固措施

5.1 数据库安全

  1. 修改默认root密码
  2. 创建应用专用用户并限制权限
  3. 启用SSL连接(生产环境必须)

5.2 容器安全

  1. 定期更新基础镜像
  2. 使用非root用户运行容器
  3. 限制不必要的capabilities
--user=1000:1000 \ --cap-drop=ALL \ --cap-add=NET_BIND_SERVICE

6. 监控与维护

6.1 日志管理

配置日志轮转和大小限制:

--log-opt max-size=10m \ --log-opt max-file=3

6.2 健康检查

为关键服务添加健康检查:

--health-cmd="mysqladmin ping -h localhost -u root -p$MYSQL_ROOT_PASSWORD" \ --health-interval=30s \ --health-timeout=5s \ --health-retries=3

7. 实际部署经验分享

在最近的一个电商项目中,我们遇到一个典型问题:SpringBoot应用启动时经常连接不上MySQL容器。排查后发现是容器启动顺序问题 - MySQL还没完全启动,SpringBoot就已经开始尝试连接。

解决方案是在SpringBoot配置中添加连接重试逻辑:

spring.datasource.hikari.connection-timeout=30000 spring.datasource.hikari.initialization-fail-timeout=1

另一个实用技巧是使用docker-compose管理多容器应用,通过depends_on控制启动顺序。这里先给出一个简单的docker-compose.yml示例:

version: '3.8' services: mysql: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: rootpass volumes: - mysql_data:/var/lib/mysql networks: - app_net healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost"] interval: 5s timeout: 3s retries: 10 app: build: . depends_on: mysql: condition: service_healthy networks: - app_net volumes: mysql_data: networks: app_net: driver: bridge

这个配置确保了SpringBoot应用只有在MySQL完全启动并响应ping命令后才会启动。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进