从零开始!Vue3+SpringBoot前后端分离项目Docker部署实战(中):Spring Boot后端与Docker Compose串联
前言在[上一篇文章]中我们已经在 CentOS 服务器上配置好了 Docker并优雅地实现了 MySQL 数据的一键初始化和持久化。本篇我们将继续向核心迈进把我们的Spring Boot后端项目进行打包镜像化同时利用 Docker Compose 的网络特性让后端容器能够无需任何修改动态连上海我们的数据库容器。☕ 第一步编写 Spring Boot 的 Dockerfile在我们的项目里后端是典型的基于 Maven 构建的 Spring Boot 项目。为了减少手动在宿主机敲mvn clean package的环境依赖问题我们采用Dockerfile 多阶段构建Multi-stage build。在backend/SpringBoot/Dockerfile这个路径下创建文件写入以下内容# --------- 阶段1构建阶段 --------- # 使用带 Maven 和 JDK 8 的镜像环境来打包我们的项目采用国内镜像源加速拉取 FROM docker.m.daocloud.io/maven:3.8.6-openjdk-8 AS build WORKDIR /app # 为了利用 Docker 缓存先单独拷贝 pom.xml 并下载依赖 COPY pom.xml . # 强制指定阿里云 Maven 镜像源下载依赖大幅提升构建速度 RUN mvn dependency:go-offline -B -Dmaven.repo.local/root/.m2/repository -s /usr/share/maven/conf/settings.xml \ || mvn dependency:go-offline -B # 拷贝全部源码并跳过测试打包 COPY src ./src RUN mvn clean package -DskipTests # --------- 阶段2运行阶段 --------- # 打包完成后我们只需要一个精简的 JRE 环境即可运行抛弃笨重的 Maven FROM docker.m.daocloud.io/openjdk:8-jre-alpine WORKDIR /app # 设置时区防止 Java 取到 UTC 时间导致数据库插入时间少了8小时 RUN sed -i s/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g /etc/apk/repositories \ apk add --no-cache tzdata \ cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \ echo Asia/Shanghai /etc/timezone # 把 第一阶段 编译好的 jar 包复制过来 COPY --frombuild /app/target/*.jar app.jar # 暴露 8080 端口 EXPOSE 8080 # 启动容器 ENTRYPOINT [java, -jar, app.jar] 为什么要用“多阶段构建”极大地缩小了最终的镜像体积如果直接把源码和 Maven 全部塞进镜像打出来的镜像可能高达 600MB而多阶段构建下最终的系统里只有精简版的JRE和一个jar包通常只有一百多兆。既安全又节省资源。 第二步Docker Compose 编排魔法有了打包脚本我们现在要在外部的主docker-compose.yml中将后端容器加入进去并告诉它“数据库在哪里”。不要用宿主机 IP我们要用服务名 (service name)进行连接。继续向你的docker-compose.yml补充后端的部分services:# ... MySQL配置在上一篇中有这里省略 ...project001-backend:build:context:./backend/SpringBoot# 指向刚刚写了 Dockerfile 的目录dockerfile:Dockerfilecontainer_name:project001-backendrestart:always# 这个 depends_on 极其重要# 结合上一篇里 MySQL 的 healthcheck它能保证后端容器等数据库彻底准备好才启动# 避免一上来 Spring Boot 启动太快连不上没准备好的数据库直接崩溃depends_on:project001-mysql:condition:service_healthyenvironment:TZ:Asia/Shanghai# Spring Boot 在启动时会优先读取这里的环境变量覆盖默认的 application.yml# 重点看连接中的 project001-mysql我们直接以容器名作为域名即可互通SPRING_DATASOURCE_URL:jdbc:mysql://project001-mysql:3306/campus_maintenance_sys?useUnicodetruecharacterEncodingutf8useSSLfalseserverTimezoneAsia/ShanghaiSPRING_DATASOURCE_USERNAME:rootSPRING_DATASOURCE_PASSWORD:${MYSQL_ROOT_PASSWORD}# 从 .env 全局读取ports:-8080:8080# 左边代表宿主机端口右边是容器内端口volumes:-./backend/SpringBoot/uploads:/app/uploads# 映射用户上传的文件目录防止重启容器后文件丢失 妙用 Environment 覆盖在本地开发时你可能在application.yml里写死了url: jdbc:mysql://localhost:3306...。但在容器里是不能填localhost的否则后端容器会去寻找自己的 3306 端口直接报错。借助 Docker Compose 注入SPRING_DATASOURCE_XXXDocker 内置的机制会无缝覆盖 Spring Boot 的spring.datasource属性**这也就是我们实现了“一份代码多处执行无痛部署”的精髓**不需要在代码里写一大堆判断统统通过编排文件注入 第三步启动并验证此时在带.env的项目根目录下敲下dockercompose up-d--buildproject001-backend在终端可以使用docker logs -f project001-backend动态查看启动日志。如果你看到了熟悉的Started CampusMaintenanceSystemApplication in 3.4 seconds (JVM running for 3.8)恭喜你这说明后端已经顺利构建完毕并且成功连接上我们构建的 MySQL 数据库等待响应了。 总结本篇我们解决了 Java 构建环境的隔离问题以及容器互联。目前后端和数据库系统已经是一套完美运行的小生态。但在现代前后端分离架构中用户不可能直接访问 8080 端口玩无厘头的 API 数据。下一篇下篇将是重头戏我会带你把Vue3 Vite跑在 Nginx 中甚至连代理跨域问题一并解决真正实现输入公网 IP 就能直接访问你的绝美项目
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2433249.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!