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
或sh
shell),用于在容器内执行命令(如配置工具)。
三、配置 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 bash
docker 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 bash
docker 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