1. 项目概述
最近在技术社区看到不少开发者对Vue3+SpringBoot前后端分离项目的容器化部署存在困惑。作为一个经历过多次完整项目部署的老兵,我想分享下从零开始的Docker化实战经验。这次我们先聚焦环境搭建和数据库容器化这两个基础但关键的环节。
这个教程适合已经掌握Vue3和SpringBoot基础开发,但尚未接触过容器化部署的中级开发者。通过完整的实操演示,你将学会:
- 如何搭建标准的Docker工作环境
- 数据库容器化的正确姿势
- 容器网络配置的核心要点
- 常见部署问题的解决方案
2. 环境准备与工具选型
2.1 操作系统选择
我推荐使用CentOS 7作为基础系统,原因有三:
- 企业级稳定性:CentOS的长期支持版本经过充分验证
- 容器友好性:内核版本(3.10+)完全支持Docker所需特性
- 文档丰富:遇到问题容易找到解决方案
注意:如果使用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 docker2.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_db4. 常见问题与解决方案
4.1 容器时区问题
Docker容器默认使用UTC时区,解决方式:
# 创建容器时加入时区参数 -e TZ=Asia/Shanghai -v /etc/localtime:/etc/localtime:ro4.2 数据库性能优化
对于生产环境MySQL容器,建议调整以下参数:
--innodb_buffer_pool_size=1G \ --innodb_log_file_size=256M \ --max_connections=2004.3 容器资源限制
避免单个容器占用全部资源:
--memory=2g \ --cpus=25. 安全加固措施
5.1 数据库安全
- 修改默认root密码
- 创建应用专用用户并限制权限
- 启用SSL连接(生产环境必须)
5.2 容器安全
- 定期更新基础镜像
- 使用非root用户运行容器
- 限制不必要的capabilities
--user=1000:1000 \ --cap-drop=ALL \ --cap-add=NET_BIND_SERVICE6. 监控与维护
6.1 日志管理
配置日志轮转和大小限制:
--log-opt max-size=10m \ --log-opt max-file=36.2 健康检查
为关键服务添加健康检查:
--health-cmd="mysqladmin ping -h localhost -u root -p$MYSQL_ROOT_PASSWORD" \ --health-interval=30s \ --health-timeout=5s \ --health-retries=37. 实际部署经验分享
在最近的一个电商项目中,我们遇到一个典型问题: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命令后才会启动。