从零开始!Vue3+SpringBoot前后端分离项目Docker部署实战(上):环境搭建与数据库容器化
前言最近我刚完成了一个“校园后勤维修工单管理系统”的全栈开发。项目采用了目前最主流的 技术栈前端 Vue3 Vite后端 Spring Boot MyBatis-Plus数据库 MySQL 8.0。随着项目顺利跑通如何把这套系统优雅、稳定地部署到云服务器上CentOS成了一个新的挑战。传统的部署方式需要手动装 JDK、配 MySQL、配 Node.js 和 Nginx极其繁琐且容易因为环境不一致导致“在我电脑上明明跑得通”的玄学问题。所以我果断选择了Docker / Docker Compose本系列将分为上、中、下三篇带你体验如何把一个前后端分离项目进行“现代化”的一键部署本篇为上篇主要讲解CentOS 服务器 Docker 环境搭建以及数据库的容器化与自动初始化。️ 第一步服务器 Docker 与 Docker Compose 环境搭建拥有一台 CentOS 服务器后第一件事就是安装 Docker。因为不可抗力原因国内拉取 Docker 镜像可能很慢所以我们要配置好国内的镜像加速。1. 安装 Docker# 卸载旧版本如果有sudoyum removedockerdocker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine# 安装依赖sudoyuminstall-yyum-utils# 配置阿里云 Docker Yum 源sudoyum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo# 安装 Docker 引擎sudoyuminstall-ydocker-ce docker-ce-cli containerd.io docker-compose-plugin# 启动并设置开机自启sudosystemctl startdockersudosystemctlenabledocker2. 配置镜像加速器为了解决docker pull拉不到镜像或超时的问题建议配置国内加速器服务。sudomkdir-p/etc/dockersudotee/etc/docker/daemon.json-EOF { registry-mirrors: [ https://docker.m.daocloud.io, https://registry.aliyuncs.com ] } EOFsudosystemctl daemon-reloadsudosystemctl restartdocker 第二步梳理项目结构针对 Docker 部署我们在项目根目录新建一个docker-compose.yml。部署版的基本结构如下project001/ ├── docker-compose.yml # 核心编排文件 ├── .env # 环境变量抽取非常关键的坑后续会讲 ├── backend/ │ └── SpringBoot/ │ ├── Dockerfile # 后端打包镜像配置 │ └── src/main/resources/sql/ │ ├── schema.sql # 建库建表SQL │ └── seed.sql # 基础数据SQL └── frontend/ └── vue/ ├── Dockerfile # 前端打包配置 └── nginx.conf # Nginx反向代理配置 第三步MySQL 数据库的容器化配置传统方式我们需要自己去执行建表、导数据而利用 Docker我们可以让 MySQL 容器在第一次启动时自动执行 SQL 脚本我们在docker-compose.yml中编写 MySQL 的配置version:3.8services:project001-mysql:image:docker.m.daocloud.io/mysql:8.0container_name:project001-mysqlrestart:always# 宕机自动重启environment:TZ:Asia/ShanghaiMYSQL_ROOT_PASSWORD:${MYSQL_ROOT_PASSWORD}# 从 .env 文件读取MYSQL_DATABASE:campus_maintenance_syscommand:---default-authentication-pluginmysql_native_password---character-set-serverutf8mb4---collation-serverutf8mb4_unicode_ciports:-3306:3306volumes:-mysql_data:/var/lib/mysql# 数据持久化防止丢失-./backend/SpringBoot/src/main/resources/sql:/docker-entrypoint-initdb.d# 初始化导入脚本healthcheck:test:[CMD,mysqladmin,ping,-h,127.0.0.1,-uroot,-p${MYSQL_ROOT_PASSWORD}]interval:10stimeout:5sretries:12volumes:mysql_data: 这里的神仙操作解析自动初始化看volumes第二行我们把包含schema.sql和seed.sql的目录映射到了容器内部的/docker-entrypoint-initdb.d。MySQL 容器在首次启动且数据目录为空时会自动按字母顺序执行这个目录下的所有.sql文件这直接省去了我们手动连 Navicat 导数据的麻烦一键搞定字符集在command里指定了utf8mb4彻底避免中文乱码问题。健康检查healthcheck非常重要后续我们的 Spring Boot 容器必须等待 MySQL 完全启动就绪后才能连数据库光光看容器 status 变成 Up 是不够的。配置了健康检查Docker 会用mysqladmin ping不断去探测直到 MySQL 真正能够对外提供服务。⚠️ 一个价值好几个小时的避坑指南请看MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}这里使用了外部环境变量。一定要在与docker-compose.yml同级的目录下新建一个.env文件MYSQL_ROOT_PASSWORD你的复杂密码**避坑**如果你不小心在没有.env文件的情况下启动了 Docker compose默认密码为空事后再加上.env重启是没用的因为 MySQL 只有在首次创建数据卷时才会读取环境变量初始化密码。如果你遇到了Access denied for user root (using password: NO/YES)错误必须删掉旧的错误数据卷重新初始化docker compose down -v一定要带上 -v清空残次品数据卷再重新启动 总结到这里我们的服务器环境已经搭建完毕且 MySQL 已经可以全自动地完成了建表与数据导入。在下一篇文章中我将手把手带你编写 Spring Boot 的多阶段构建Dockerfile并将其和数据库做完美的编排串联敬请期待
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2433247.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!