前后端项目上云☁部署
本文最后更新于49 天前,其中的信息可能已经过时,如有错误请发送邮件到big_fw@foxmail.com

JAVA(SpringBoot/Maven/tomcat)+Node.js(nvm/Vue/React/AngularJS)+Nginx中间件等前后端项目上云☁部署 所需的Docker容器基础镜像,清单如下:

1、JDK11基础镜像; 2、NVM基础镜像; 3、Nginx基础镜像。

前端项目 联合调试 前端项目的渲染呈现 后端项目的接口处理 数据存储的读取落盘

基于 Docker 部署 Jenkins 持续集成环境,并配置 Java、Maven 等开发工具,实现自动化构建项目的完整操作流程,搭建一个能自动编译、打包 Java 项目的 CI/CD(持续集成 / 持续部署)环境。

一、环境准备

一、Docker 与 Jenkins 基础操作

  1. docker info
    • 查看 Docker 系统信息,包括镜像仓库地址、存储驱动、容器 / 镜像数量等,用于确认 Docker 服务是否正常运行。
  2. docker --version
    • 查看当前 Docker 版本,验证 Docker 是否安装成功。
  3. docker images
    • 列出本地所有 Docker 镜像,显示镜像名称、标签、ID、创建时间和大小。
  4. docker images -aq
    • -a 显示所有镜像(包括中间层镜像),-q 只显示镜像 ID,用于批量操作镜像(如删除所有镜像)。
  5. docker ps -a
    • 列出所有容器(包括运行中、已停止的),显示容器 ID、镜像、命令、状态等信息。
  6. docker ps -aq
    • 只显示所有容器的 ID,用于批量操作容器(如删除所有容器)。
  7. docker search jenkins
    • 在 Docker Hub 上搜索包含 “jenkins” 关键词的镜像,用于查找可用的 Jenkins 镜像。
  8. docker pull jenkins:latest
    • 拉取标签为 latest 的 Jenkins 镜像(旧版官方镜像,已逐步废弃)。
  9. docker pull jenkins/jenkins:lts
    • 拉取官方推荐的 Jenkins 长期支持版(LTS)镜像(jenkins/jenkins 是新版官方镜像仓库)。

二、Jenkins 容器启动(核心配置)

  1. 启动 Jenkins 容器
    • docker run --name jenkins -u root --rm -d -p 8080:8080 -p 50000:50000 -v /root/docker/volumes/var/jenkins_home:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock jenkins/jenkins:lts
  2. 增强命令:自动重启 Jenkins 
    • docker run --name=jenkins --restart=always -u 0 --rm -d -p 8080:8080 -p 50000:50000 -v /root/docker/volumes/var/jenkins_home:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock jenkins/jenkins:lts
      • 比上一条多了 --restart=always:容器意外停止时自动重启(适合生产环境)。

3.docker exec -it jenkins bash

docker exec -it jenkins /bin/sh

  • 两种进入 Jenkins 容器交互终端的方式(bashsh shell),用于在容器内执行命令(如配置工具)。

三、配置 Maven 环境(Java 项目构建工具)

  1.  cd /root/docker/volumes/var/jenkins_home/tools/hudson.tasks.Maven_MavenInstallation/apache-maven-3.8.1
    • 进入 Jenkins 工具目录中 Maven 的安装路径。
    (若无此目录,需要先创建该目录,可以使用命令: mkdir /root/docker/volumes/var/jenkins_home/tools/hudson.tasks.Maven_MavenInstallation/apache-maven-3.8.1,再进入该目录)
  2. unzip apache-maven-3.8.1-bin.zip
    • 解压 Maven 安装包(需提前下载到该目录,没有安装包的留言评论私信我哟~,免费提供安装包一份)。
  3. cd /root/docker/volumes/var/jenkins_home/tools/hudson.tasks.Maven_MavenInstallation/apache-maven-3.8.1
    • 进入解压后的 Maven 目录。(若已在这个目录可不用执行)
  4. mv ./apache-maven-3.8.1/\* .
    • 将解压后的 Maven 子目录内容移动到当前目录(扁平化结构,避免路径嵌套)。
  5. 谨慎命令(rm -rf可不能乱用哦 看好删什么了) rm -rf ./apache-maven-3.8.1
  6. export MAVEN_HOME=/root/docker/volumes/var/jenkins_home/tools/hudson.tasks.Maven_MavenInstallation/apache-maven-3.8.1
    • 配置 Maven 环境变量,指定 Maven 安装路径(供 Jenkins 调用)。

四、配置 Java 环境(JDK)

  1. cd /root/docker/volumes/var/jenkins_home/tools/hudson.tasks.JAVA_JDKInstallation/jdk-11_linux-x64_bin
    • 进入 Jenkins 工具目录中 JDK 11 的安装路径。(同上,没有该目录需使用mkdir创建)
  2.  wget https://mirrors.tuna.tsinghua.edu.cn/Adoptium/11/jdk/x64/linux/OpenJDK11U-jdk_x64_linux_hotspot_11.0.21_9.tar.gz
    • 从清华大学镜像站下载 OpenJDK 11 安装包(速度快,国内可用)。
    注意:此时官方网站上的安装包版本可能没有以上版本,自己根据实际情况进行更改)如何查看呢,可以打开代码中的清华大学镜像网站查看https://mirrors.tuna.tsinghua.edu.cn/Adoptium/11/jdk/x64/linux/

如图所示,发现只有这个版本,如果你要使用此链接需要修改相应数据~这我们将代码修改为: wget https://mirrors.tuna.tsinghua.edu.cn/Adoptium/11/jdk/x64/linux/OpenJDK11U-jdk_x64_linux_hotspot_11.0.28_6.tar.gz

  1. tar -zxvf OpenJDK11U-jdk_x64_linux_hotspot_11.0.28_6.tar.gz
    • 解压 JDK 11 安装包。
  2. cd ./jdk-11.0.28+6/
    • 进入解压后的 JDK 11 目录。
  3. export JAVA_HOME=/root/docker/volumes/var/jenkins_home/tools/hudson.tasks.JAVA_JDKInstallation/jdk-11_linux-x64_bin/jdk-11.0.28+6
    • 配置 JDK 11 环境变量,供 Jenkins 调用。 export PATH=$JAVA_HOME/bin:$PATH
      • 将 JDK 的 bin 目录添加到系统 PATH,确保 java、javac 等命令全局可用
  4. cd /root/docker/volumes/var/jenkins_home/tools/hudson.tasks.JAVA_JDKInstallation/jdk-8_linux-x64_bin
    • 进入 JDK 8 的安装路径(支持兼容旧项目)。(同上没有目录需创建~)
  5. wget https://mirrors.tuna.tsinghua.edu.cn/Adoptium/8/jdk/x64/linux/OpenJDK8U-jdk_x64_linux_hotspot_8u462b08.tar.gz
    • 下载 OpenJDK 8 安装包。(同上,修改安装包信息~)
  6. tar -zxvf OpenJDK8U-jdk_x64_linux_hotspot_8u462b08.tar.gz
    • 解压 JDK 8 安装包。
  7. cd ./jdk8u462-b08/
    • 进入解压后的 JDK 8 目录。
  8. export JAVA_HOME= /root/docker/volumes/var/jenkins_home/tools/hudson.tasks.JAVA_JDKInstallation/jdk-8_linux-x64_bin/jdk8u462-b08
    • 配置 JDK 8 环境变量。(同上)

五、在 Jenkins 容器内配置 Docker 客户端

  1. cd /root/docker/volumes/var/jenkins_home/tools/docker
    • 进入 Jenkins 工具目录中 Docker 客户端的安装路径。(没有目录请新建再进入~)
  2. wget https://download.docker.com/linux/static/stable/x86_64/docker-24.0.7.tgz
    • 下载 Docker 24.0.7 客户端(适合与宿主机 Docker 兼容)。
  3. tar -zxvf docker-24.0.7.tgz
    • 解压 Docker 客户端安装包。
  4. cd /root/docker/volumes/var/jenkins_home/tools/docker
    • 进入解压后的 Docker 目录。
  5.  mv ./docker/\* .
    • 将子目录中的 Docker 工具移动到当前目录(扁平化结构)。
    此时会存在一个问题,在docker文件夹里存在一个名为docker的文件,将docker文件夹里的文件剪切出来的时候,由于文件与文件夹重名,所以可能会导致该文件剪切失败,可以通过xftp软件打开所在文件,将文件夹进行改名,再将文件夹里的文件粘贴出来,全粘贴出来时候便可删除该空文件夹(当然你也可以使用命令执行此操作~)
  6. 谨慎命令 rm -rf ./docker
    • 删除空的子目录(清理冗余)。(若在以上步骤已经删除了docker文件夹之后,便不用执行该语句,因为已经删除啦~)
  7. docker exec -it jenkins sh
    • 进入 Jenkins 容器终端。
  8. echo $PATH
    • 查看容器内环境变量 PATH(确认可执行文件路径)。
  9. ln -s /var/jenkins_home/tools/docker/docker /usr/local/bin/docker
    • 为 Docker 客户端创建软链接到 PATH 目录下,使 docker 命令全局可用。
  10.  docker -v
    • 验证 Docker 客户端是否安装成功(显示版本即正常)。
    此时可能会存在权限问题,加上可执行权限即可(可ai查询)。
  11. exit
    • 退出容器终端。

六、构建 Java 基础镜像

  1. docker images
    • 查看本地镜像(确认基础镜像是否存在)。
  2. cd /root/docker/volumes/var/jenkins_home/tools/hudson.tasks.JAVA_JDKInstallation/jdk-11_linux-x64_bin
    • 进入 JDK 11 目录(用于构建镜像)。
  3. docker build -t java:11 .
    • 基于当前目录的 Dockerfile 构建标签为 java:11 的镜像(供后端项目运行)。
    执行此命令需要在该目录下放置一个dockerfile文件。(需要文件的可以留言评论私信我哟~)
  4. docker images
    • 确认 java:11 镜像是否构建成功。
  5. cd /root/docker/volumes/var/jenkins_home/tools/hudson.tasks.JAVA_JDKInstallation/jdk-8_linux-x64_bin
    • 进入 JDK 8 目录。
  6. docker build -t java:8 .
    • 构建标签为 java:8 的镜像。(同样的执行该命令也需要dockerfile文件)
  7. docker images
    • 确认 java:8 镜像是否构建成功。

七、Java 容器启停操作(验证java:8java:11镜像是否能正常使用

  1. docker run --name java_8 --restart always -i -d java:8
    • 启动 java:8 镜像的容器,命名为 java_8,设置自动重启。
  2. docker ps -a
    • 查看 java_8 容器状态。
  3. docker exec -it java_8 bash
  4. docker exec -it java_8 /bin/bash
    • 进入 java_8 容器的交互终端。
  5. docker rm java_8
    • 删除停止状态的 java_8 容器。
  6. docker rm -f java_8
    • 强制删除运行中的 java_8 容器。
  7. docker run --name java_11 --restart always -i -d java:11
    • 启动 java:11 镜像的容器,命名为 java_11
  8. docker ps -a
    • 查看 java_11 容器状态。
  9. docker exec -it java_11 bash
  10. docker exec -it java_11 /bin/bash
    • 进入 java_11 容器的交互终端。
  11. docker rm java_11
    • 删除停止状态的 java_11 容器。
  12. docker rm -f java_11
    • 强制删除运行中的 java_11 容器。

二、前后端项目部署(以一大神的个人博客部署为例)

云端环境 部署统一路径: 前端项目根路径: /root/docker/volumes/nvm/usr/local/nvm/v0.40.1/personal_blog/Vue3

后端项目根路径: /root/docker/volumes/blog/APIServer/personal_blog

从源码的前后端中,分别拷贝这些文件到相应前后端目录

添加settings-yanxikeji文件,并修改内容。

一、前端环境搭建与部署(基于 Node.js 和 Vue)

1. 构建 nvm 镜像并启动基础容器

 cd /root/docker/volumes/var/jenkins_home/tools/hudson.tasks.nvmInstallation/nvm/v0.40.1  
  • 作用:进入 nvm 工具的安装目录(存放 nvm 相关文件的路径)。(同样,没有需)
 wget -O ./custom-nvm-Dockerfile https://fchxqm.com/static/nvm/v0.40.1/custom-nvm-Dockerfile 
  • 作用:下载自定义的 nvm 镜像构建文件(Dockerfile)。
  • 参数:-O ./custom-nvm-Dockerfile 指定下载文件的保存路径和名称(当前目录下的custom-nvm-Dockerfile)。
 docker build -t custom_nvm:0.40.1 -f ./custom-nvm-Dockerfile . 
  • 作用:基于下载的 Dockerfile 构建 nvm 镜像。
  • 参数:
    • -t custom_nvm:0.40.1:给镜像打标签(名称custom_nvm,版本0.40.1);
    • -f ./custom-nvm-Dockerfile:指定使用当前目录的custom-nvm-Dockerfile作为构建文件;
    • .:表示构建上下文为当前目录(Docker 会读取该目录下的文件)。
 docker run --name custom_nvm_0.40.1 --restart always -p 80:3000 -v /root/docker/volumes/nvm/usr/local/nvm/v0.40.1:/usr/local/nvm/v0.40.1 -d custom_nvm:0.40.1 
  • 作用:启动前端nvm容器并对外暴露端口。
  • 注意:若80端口被占,自行换成相应没使用过的端口,或者把80端口释放。(我就改成了81端口)
  • 参数:
    • --name custom_nvm_0.40.1:给容器命名(便于后续操作);
    • --restart always:容器退出时自动重启(确保服务稳定运行);
    • -p 80:3000 表示将宿主机的 80 端口映射到容器的 3000 端口(前端项目默认运行在容器的 3000 端口,外部通过服务器 80 端口访问)。
    • -v 宿主路径:容器路径:将宿主机的 nvm 数据目录挂载到容器内(持久化 nvm 配置,避免容器删除后数据丢失);
    • -d:后台运行容器;
    • custom_nvm:0.40.1:基于该镜像启动容器。
 docker ps -a
  • 作用:查看所有容器状态(包括运行中、已停止),验证custom_nvm_0.40.1容器是否启动成功。

2. 进入 nvm 容器配置前端环境

 docker exec -it custom_nvm_0.40.1 /bin/bash
  • 作用:进入运行中的 nvm 容器,打开交互终端(用于执行容器内命令)。
  • 参数:
    • -it-i 保持标准输入打开,-t 分配伪终端(实现交互模式);
    • custom_nvm_0.40.1:目标容器名称;
    • /bin/bash:在容器内启动 bash 终端。

3. 安装 Node.js 和 Vue 脚手架

 nvm i 18.19.0 && node -v && npm i -g @vue/cli
  • 作用:在容器内安装指定版本的 Node.js 和 Vue 工具。
  • 分步解析:
    • nvm i 18.19.0:用 nvm 安装 Node.js 18.19.0 版本(nvm 是 Node 版本管理工具,可切换不同版本);
    • node -v:输出 Node.js 版本(验证安装成功);
    • npm i -g @vue/cli:全局安装 Vue 脚手架(-g 表示全局安装,@vue/cli是 Vue 项目的构建工具)。

4. 查看全局 npm 包

 npm list -g --depth 0
  • 作用:查看全局安装的 npm 包(确认@vue/cli是否安装成功)。
  • 参数:--depth 0 只显示顶层依赖(不展开子依赖,输出更简洁)。

二、后端部署流程(Java/Spring Boot)

1. 配置 Maven 和 JDK 环境变量

 export PATH="$PATH:/root/docker/volumes/var/jenkins_home/tools/hudson.tasks.Maven_MavenInstallation/apache-maven-3.8.1/bin"   
  • 作用:将 Maven 的可执行文件路径添加到系统PATH(使mvn命令全局可用)。
  • export:声明环境变量,$PATH 表示保留原有PATH内容,追加新路径。
 export PATH="$PATH:/root/docker/volumes/var/jenkins_home/tools/hudson.tasks.JAVA_JDKInstallation/jdk-11_linux-x64_bin/jdk-11.0.28+6/bin" 
  • 作用:将 JDK 11 的可执行文件路径添加到PATH(使javajavac命令全局可用)。
 cd /root/docker/volumes/blog/APIServer/personal_blog 
  • 作用:进入后端项目目录(personal_blog,推测为 Spring Boot 项目根目录)。
 mvn -v 
  • 作用:输出 Maven 版本信息(验证 Maven 是否配置成功)。
 mvn clean -s /root/docker/volumes/var/jenkins_home/tools/hudson.tasks.Maven_MavenInstallation/apache-maven-3.8.1/conf/settings-yanxikeji.xml -e -X
  • 作用:清理后端项目(删除旧编译文件)。
  • 参数:
    • clean:Maven 的清理命令(删除target目录);
    • -s 配置文件路径:指定自定义的 Maven 配置文件(可能包含私有仓库地址、镜像源等);
    • -e:输出详细错误日志;
    • -X:输出调试级日志(用于排查构建问题)。

2. 打包后端项目并进入容器

 cd /root/docker/volumes/blog/APIServer/personal_blog 
  • 作用:进入后端项目目录(同步骤 1)。
 mvn package -s /root/docker/volumes/var/jenkins_home/tools/hudson.tasks.Maven_MavenInstallation/apache-maven-3.8.1/conf/settings-yanxikeji.xml 
  • 作用:用 Maven 编译并打包项目为 JAR 文件。
  • package:Maven 的打包命令(编译源码并生成target/blog-backend-1.0.0.jar)。
 docker exec -it personal_blog_java_11 /bin/bash
  • 作用:进入已启动的 Java 容器(personal_blog_java_11),准备部署 JAR 包。

3. 重启后端容器并部署最新版本

 cd /root/docker/volumes/blog/APIServer/personal_blog 
  • 作用:进入后端项目目录。
 mvn package -s /root/docker/volumes/var/jenkins_home/tools/hudson.tasks.Maven_MavenInstallation/apache-maven-3.8.1/conf/settings-yanxikeji.xml 
  • 作用:重新打包项目(确保使用最新代码)。
 docker rm -f personal_blog_java_11 
  • 作用:强制删除旧的后端容器(-f 表示强制删除,即使容器正在运行)。
 docker run --name personal_blog_java_11 --restart always -i -d -p 8080:8080 -v /root/docker/volumes/var/jenkins_home:/var/jenkins_home -v /root/docker/volumes/blog/APIServer/personal_blog:/usr/local/app/personal_blog java:11 
  • 作用:启动新的 Java 容器部署后端服务。
  • 参数:
    • --name personal_blog_java_11:容器命名;
    • -p 8080:8080:宿主机 8080 端口映射到容器 8080 端口(后端服务默认端口);
    • -v 宿主项目路径:容器路径:将后端项目目录挂载到容器(便于容器读取 JAR 包);
    • java:11:基于 JDK 11 镜像启动容器。
 docker exec -it personal_blog_java_11 /bin/bash
  • 作用:进入新启动的 Java 容器,准备启动后端服务。

4. 启动后端 Java 应用

注意执行该命令的路径!是在含blog-backend-1.0.0.jar这个jar包的路径哦!

一般是这个:/root/docker/volumes/blog/APIServer/personal_blog/target**

 cd /root/docker/volumes/blog/APIServer/personal_blog/target
 ​
 nohup java -jar blog-backend-1.0.0.jar > blog-backend-1.0.0_all.log 2>&1 &
  • 作用:后台启动 Java 应用并记录日志。
  • 分步解析:
    • nohup:忽略终端关闭信号(确保进程持续运行);
    • java -jar blog-backend-1.0.0.jar:运行 JAR 包;
    • > blog-backend-1.0.0_all.log:将标准输出写入日志文件;
    • 2>&1:将错误输出重定向到标准输出(统一写入日志);
    • &:后台运行进程。
 tail -f -n 50 blog-backend-1.0.0_all.log 
  • 作用:实时查看日志文件的最后 50 行(-n 50),验证应用是否启动成功(如是否出现 “Started Application in XX seconds”)。
  • tail -f:实时跟踪日志更新。

如果出现端口被占用的情况,可能是因为前面已经执行过了,可以执行一下命令看端口被什么占用了:

 netstat -tunlp | grep 8080

是他!就是前面执行过一次出问题了,所以我现在把他杀死再次启动。

 # 替换 PID 为上一步查到的进程 ID
 kill -9 PID

这里的PID就是529871

再次启动:nohup java -jar blog-backend-1.0.0.jar > blog-backend-1.0.0_all.log 2>&1 &

查看日志tail -f -n 50 blog-backend-1.0.0_all.log `

这样后端就启动成功啦!





三、启动前端

1. 进入前端容器

 # 进入运行中的nvm容器(前端环境所在容器)
 docker exec -it custom_nvm_0.40.1 /bin/bash

2. 进入前端项目根目录

 # 切换到前端项目根路径(Vue3项目目录)
 cd /usr/local/nvm/v0.40.1/personal_blog/Vue3

(说明:容器内路径与宿主机路径通过 -v 挂载关联,宿主机的 /root/docker/volumes/nvm/usr/local/nvm/v0.40.1 对应容器内的 /usr/local/nvm/v0.40.1

3. 启动前端项目(开发环境 / 生产环境)

  • 开发环境启动(用于调试,热更新): # 通常Vue3项目的开发启动命令(具体以项目package.json中的”scripts”为准)
  • npm run serve启动:启动后,前端服务会运行在容器的 3000 端口(默认,具体以项目配置为准),结合之前的端口映射(-p 80:3000),外部可通过 服务器IP:80 访问。

这样前端就启动成功啦!现在可以通过你的公网IP加前端容器映射的端口号进行访问啦~

例如我的:

我由于80端口被占,前面前端环境搭建使用的81端口,所以我访问是网址是公网IP:81

 docker run --name custom_nvm_0.40.1 --restart always -p 81:3000 -v /root/docker/volumes/nvm/usr/local/nvm/v0.40.1:/usr/local/nvm/v0.40.1 -d custom_nvm:0.40.1 
  • 作用:启动前端nvm容器并对外暴露端口。

大功告成!!!

有什么问题可以评论区一起探讨~😇

文末附加内容

评论

  1. ty
    Windows Edge
    2 月前
    2025-8-18 9:35:38

    太细了👍

  2. lhp
    Windows Edge
    2 月前
    2025-8-18 16:16:47

    666

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇