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 基础操作
docker info- 查看 Docker 系统信息,包括镜像仓库地址、存储驱动、容器 / 镜像数量等,用于确认 Docker 服务是否正常运行。
docker --version- 查看当前 Docker 版本,验证 Docker 是否安装成功。
docker images- 列出本地所有 Docker 镜像,显示镜像名称、标签、ID、创建时间和大小。
docker images -aq-a显示所有镜像(包括中间层镜像),-q只显示镜像 ID,用于批量操作镜像(如删除所有镜像)。
docker ps -a- 列出所有容器(包括运行中、已停止的),显示容器 ID、镜像、命令、状态等信息。
docker ps -aq- 只显示所有容器的 ID,用于批量操作容器(如删除所有容器)。
docker search jenkins- 在 Docker Hub 上搜索包含 “jenkins” 关键词的镜像,用于查找可用的 Jenkins 镜像。
docker pull jenkins:latest- 拉取标签为
latest的 Jenkins 镜像(旧版官方镜像,已逐步废弃)。
- 拉取标签为
docker pull jenkins/jenkins:lts- 拉取官方推荐的 Jenkins 长期支持版(LTS)镜像(
jenkins/jenkins是新版官方镜像仓库)。
- 拉取官方推荐的 Jenkins 长期支持版(LTS)镜像(
二、Jenkins 容器启动(核心配置)
- 启动 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
- 增强命令:自动重启 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 容器交互终端的方式(
bash或shshell),用于在容器内执行命令(如配置工具)。
三、配置 Maven 环境(Java 项目构建工具)
-
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,再进入该目录) unzip apache-maven-3.8.1-bin.zip- 解压 Maven 安装包(需提前下载到该目录,没有安装包的留言评论私信我哟~,免费提供安装包一份)。
cd /root/docker/volumes/var/jenkins_home/tools/hudson.tasks.Maven_MavenInstallation/apache-maven-3.8.1- 进入解压后的 Maven 目录。(若已在这个目录可不用执行)
mv ./apache-maven-3.8.1/\* .- 将解压后的 Maven 子目录内容移动到当前目录(扁平化结构,避免路径嵌套)。
- 谨慎命令(rm -rf可不能乱用哦 看好删什么了)
rm -rf ./apache-maven-3.8.1 export MAVEN_HOME=/root/docker/volumes/var/jenkins_home/tools/hudson.tasks.Maven_MavenInstallation/apache-maven-3.8.1- 配置 Maven 环境变量,指定 Maven 安装路径(供 Jenkins 调用)。
四、配置 Java 环境(JDK)
cd /root/docker/volumes/var/jenkins_home/tools/hudson.tasks.JAVA_JDKInstallation/jdk-11_linux-x64_bin- 进入 Jenkins 工具目录中 JDK 11 的安装路径。(同上,没有该目录需使用mkdir创建)
-
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 安装包(速度快,国内可用)。

如图所示,发现只有这个版本,如果你要使用此链接需要修改相应数据~这我们将代码修改为: wget https://mirrors.tuna.tsinghua.edu.cn/Adoptium/11/jdk/x64/linux/OpenJDK11U-jdk_x64_linux_hotspot_11.0.28_6.tar.gz
tar -zxvf OpenJDK11U-jdk_x64_linux_hotspot_11.0.28_6.tar.gz- 解压 JDK 11 安装包。
cd ./jdk-11.0.28+6/- 进入解压后的 JDK 11 目录。
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 等命令全局可用
- 配置 JDK 11 环境变量,供 Jenkins 调用。 export PATH=$JAVA_HOME/bin:$PATH
cd /root/docker/volumes/var/jenkins_home/tools/hudson.tasks.JAVA_JDKInstallation/jdk-8_linux-x64_bin- 进入 JDK 8 的安装路径(支持兼容旧项目)。(同上没有目录需创建~)
wget https://mirrors.tuna.tsinghua.edu.cn/Adoptium/8/jdk/x64/linux/OpenJDK8U-jdk_x64_linux_hotspot_8u462b08.tar.gz- 下载 OpenJDK 8 安装包。(同上,修改安装包信息~)
tar -zxvf OpenJDK8U-jdk_x64_linux_hotspot_8u462b08.tar.gz- 解压 JDK 8 安装包。
cd ./jdk8u462-b08/- 进入解压后的 JDK 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 客户端
cd /root/docker/volumes/var/jenkins_home/tools/docker- 进入 Jenkins 工具目录中 Docker 客户端的安装路径。(没有目录请新建再进入~)
wget https://download.docker.com/linux/static/stable/x86_64/docker-24.0.7.tgz- 下载 Docker 24.0.7 客户端(适合与宿主机 Docker 兼容)。
tar -zxvf docker-24.0.7.tgz- 解压 Docker 客户端安装包。
cd /root/docker/volumes/var/jenkins_home/tools/docker- 进入解压后的 Docker 目录。
mv ./docker/\* .- 将子目录中的 Docker 工具移动到当前目录(扁平化结构)。
- 谨慎命令
rm -rf ./docker- 删除空的子目录(清理冗余)。(若在以上步骤已经删除了docker文件夹之后,便不用执行该语句,因为已经删除啦~)
docker exec -it jenkins sh- 进入 Jenkins 容器终端。
echo $PATH- 查看容器内环境变量
PATH(确认可执行文件路径)。
- 查看容器内环境变量
ln -s /var/jenkins_home/tools/docker/docker /usr/local/bin/docker- 为 Docker 客户端创建软链接到
PATH目录下,使docker命令全局可用。
- 为 Docker 客户端创建软链接到
-
docker -v- 验证 Docker 客户端是否安装成功(显示版本即正常)。
exit- 退出容器终端。
六、构建 Java 基础镜像
docker images- 查看本地镜像(确认基础镜像是否存在)。
cd /root/docker/volumes/var/jenkins_home/tools/hudson.tasks.JAVA_JDKInstallation/jdk-11_linux-x64_bin- 进入 JDK 11 目录(用于构建镜像)。
docker build -t java:11 .- 基于当前目录的 Dockerfile 构建标签为
java:11的镜像(供后端项目运行)。
- 基于当前目录的 Dockerfile 构建标签为
docker images- 确认
java:11镜像是否构建成功。
- 确认
cd /root/docker/volumes/var/jenkins_home/tools/hudson.tasks.JAVA_JDKInstallation/jdk-8_linux-x64_bin- 进入 JDK 8 目录。
docker build -t java:8 .- 构建标签为
java:8的镜像。(同样的执行该命令也需要dockerfile文件)
- 构建标签为
docker images- 确认
java:8镜像是否构建成功。
- 确认
七、Java 容器启停操作(验证java:8和java:11镜像是否能正常使用)
docker run --name java_8 --restart always -i -d java:8- 启动
java:8镜像的容器,命名为java_8,设置自动重启。
- 启动
docker ps -a- 查看
java_8容器状态。
- 查看
docker exec -it java_8 bashdocker exec -it java_8 /bin/bash- 进入
java_8容器的交互终端。
- 进入
docker rm java_8- 删除停止状态的
java_8容器。
- 删除停止状态的
docker rm -f java_8- 强制删除运行中的
java_8容器。
- 强制删除运行中的
docker run --name java_11 --restart always -i -d java:11- 启动
java:11镜像的容器,命名为java_11。
- 启动
docker ps -a- 查看
java_11容器状态。
- 查看
docker exec -it java_11 bashdocker exec -it java_11 /bin/bash- 进入
java_11容器的交互终端。
- 进入
docker rm java_11- 删除停止状态的
java_11容器。
- 删除停止状态的
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(使java、javac命令全局可用)。
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容器并对外暴露端口。

大功告成!!!
有什么问题可以评论区一起探讨~😇






太细了👍
666