
1. 项目概述最近在技术社区看到不少开发者对Vue3SpringBoot前后端分离项目的容器化部署存在困惑。作为一个经历过多次完整项目部署的老兵我想分享下从零开始的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 17SpringBoot 3.x要求Maven 3.8IDE推荐IntelliJ IDEA3. 数据库容器化实战3.1 MySQL容器部署使用官方MySQL镜像部署生产级数据库服务docker run -d \ --name mysql8 \ -p 3306:3306 \ -e MYSQL_ROOT_PASSWORDyour_secure_password \ -e MYSQL_DATABASEapp_db \ -e MYSQL_USERapp_user \ -e MYSQL_PASSWORDuser_password \ -v /data/mysql:/var/lib/mysql \ --restart unless-stopped \ mysql:8.0 \ --character-set-serverutf8mb4 \ --collation-serverutf8mb4_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_password3.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 TZAsia/Shanghai -v /etc/localtime:/etc/localtime:ro4.2 数据库性能优化对于生产环境MySQL容器建议调整以下参数--innodb_buffer_pool_size1G \ --innodb_log_file_size256M \ --max_connections2004.3 容器资源限制避免单个容器占用全部资源--memory2g \ --cpus25. 安全加固措施5.1 数据库安全修改默认root密码创建应用专用用户并限制权限启用SSL连接生产环境必须5.2 容器安全定期更新基础镜像使用非root用户运行容器限制不必要的capabilities--user1000:1000 \ --cap-dropALL \ --cap-addNET_BIND_SERVICE6. 监控与维护6.1 日志管理配置日志轮转和大小限制--log-opt max-size10m \ --log-opt max-file36.2 健康检查为关键服务添加健康检查--health-cmdmysqladmin ping -h localhost -u root -p$MYSQL_ROOT_PASSWORD \ --health-interval30s \ --health-timeout5s \ --health-retries37. 实际部署经验分享在最近的一个电商项目中我们遇到一个典型问题SpringBoot应用启动时经常连接不上MySQL容器。排查后发现是容器启动顺序问题 - MySQL还没完全启动SpringBoot就已经开始尝试连接。解决方案是在SpringBoot配置中添加连接重试逻辑spring.datasource.hikari.connection-timeout30000 spring.datasource.hikari.initialization-fail-timeout1另一个实用技巧是使用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命令后才会启动。