04-基于Docker的项目发布
本文介绍了将前后端项目通过Docker容器化部署的完整流程。前端项目基于Nginx构建容器,通过修改Dockerfile实现网页文件部署;后端项目使用OpenJDK17基础镜像,结合Maven打包和Docker Compose实现容器化部署。详细说明了从Gitlab配置Dockerfile、Jenkins任务配置、服务器SSH连接设置到最终容器构建运行的完整步骤,包括镜像构建、旧容器清理、端口映射
服务器资源与角色
| 身份 | 角色 | ip | 版本 |
|---|---|---|---|
| 服务器 | Gitlab | 10.0.0.133 | Rocky Linux 9 |
| 服务器 | Jenkins | 10.0.0.134 | Rocky Linux 9 |
| 服务器 | Web | 10.0.0.135 | Rocky Linux 9 |
| 服务器 | APP | 10.0.0.137 | Rocky Linux 9 |
| 中间件 | Nginx | - | 1.20.1 |
| 中间件 | JDK | - | OpenJDK 17 |
| 中间件 | Maven | - | 3.6.3 |
| 中间件 | Git | - | 2.47.3 |
基于之前的 前端项目myweb 和 后端项目myapp ,我们是将它们分别发送到对应服务器上直接运行,而在现在的实际业务环境中项目大概率是以docker容器的方式运行的,这样便于直接观察项目的状态和资源的分配
先理清发布的思路
1、 编写Dockerfile文件并上传到Gitlab
2、 Jenkins拉取代码并推送到目标服务器
3、 如果已存在镜像先删除旧镜像
4、 目标服务器根据接收到的Dockerfile文件构建镜像
一、构建前端项目容器
1.Gitlab新增Docker配置
-
在Gitlab的myweb项目中添加docker文件夹,在其中创建dockerfile文件
-
编辑dockerfile,添加自定义容器信息
-
因为我们的网页文件名为
myweb.html,我们是以nginx容器方式代理网页,nginx默认配置是先加载index,html,所以我们在配置中先删除容器内/usr/share/nginx/html路径下的内容,后用COPY指令将myweb.html复制到容器内/usr/share/nginx/html路径下 -
这里因为我们已经将主页文件命名为myweb.html,而规范是主页文件名是index.html,规范命名可以不用改任何配置就可让nginx代理,对于此项目非规范命名我们可以:添加nginx配置文件,让myweb容器的nginx基于此自定义配置文件构建,另外简单做法是将项目命名规范化。这里为了节省时间,我们直接重命名一下
-
FROM nginx:1.20.1
RUN rm -rf /usr/share/nginx/html/*
COPY . /usr/share/nginx/html
RUN mv /usr/share/nginx/html/myweb.html /usr/share/nginx/html/index.html
EXPOSE 82
CMD ["nginx", "-g", "daemon off;"]
| 添加dockerfile |
|---|
![]() |
2.Jenkins配置任务
- 新建任务
-
在Jenkins主页点击
新建任务输入任务名称myweb-docker并选择构建一个自由风格的项目,最后点击确定 -
源码管理依旧选择
Git,然后Repository URL输入仓库地址http://85.137.247.103:8765/root/myweb.git -
分支名与Gitlab一致,保存后可以先构建查看日志,验证仓库是否配置成功
| 配置myweb-docker |
|---|
![]() |
![]() |
- 配置web服务器
在拉取代码成功后,就需要将其推送到web服务器,这里我们使用Publish Over SSH插件,可以使用这个插件配置连接指定服务器,并执行相关命令、
在Jenkins
系统管理->插件管理中Available plugins搜索Publish Over SSH插件并安装在Jenkins
系统管理->系统设置中,拉到最下边可以看到该插件提供的相关设置,点击新增,添加web服务器相关信息
Name自定义,作为服务器在Jenkins中的标识
Hostname为目标服务器IP
Username为登录用户名
Remote Directory为登录目标服务器后的工作目录,如果该目录不存在,则需要去目标服务器手动创建
点击高级,勾选
Use password authentication, or use a different key,在Passphrase / Password填写登录用户名对应的密码
| 配置服务器 |
|---|
![]() |
-
当我们配置好目标服务器信息,创建好目录后,点击最下边
Test Configuration后无任何错误信息就是配置成功,点击应用后保存
- 推送配置
在myweb-docker任务配置中下拉,找到
构建后操作点击增加构建后操作步骤选择Send build artifacts over SSH在SSH Server中,
Name选择我们之前在系统设置中配置的目标服务器名称
Transfer Set中Source files代表将Jenkins所在服务器那些文件复制到目标服务器,这里我们选择将当前路径下所有文件:**/*
Exec command为复制后需要在目标服务器执行的命令,这里我们进入目标目录cd /usr/local/myapp-docker,然后实现:a.停止并删除旧容器;b.删除旧镜像并构建新镜像;c.将新镜像运行成容器在第一次执行之前,先将构建镜像和运行容器的命令在服务器执行一次,否则a步骤会报错
# 进入Jenkins推送文件的目录
cd /usr/local/myweb-docker
# 停止并删除旧容器
docker stop myweb
docker rm myweb
# 删除旧镜像
docker rmi myweb-image:latest
# 重新构建镜像
docker build -t myweb-image:latest -f docker/dockerfile .
# 重新运行容器
docker run -d -p 82:80 --name myweb myweb-image:latest
| 推送配置 |
|---|
![]() |
-
然后点击构建,观察控制台输出发现Jenkins任务执行成功
| 推送配置 |
|---|
![]() |
3.浏览器访问
-
任务构建成功后,web服务器上docker容器已经启动,我们访问对应ip和端口
http://10.0.0.135:82/就可以看到我们自己的前端页面
| 浏览器访问 |
|---|
![]() |
![]() |
二、构建后端Maven项目容器
-
基于之前完成的myapp项目,将其打包构建成运行在后端app服务器的docker容器
1.Gitlab新增Docker配置
- 编写dockerfile
我们首先基于docker构建流程的完成dockerfile的编写,通过dockerfile的内容构建自定义镜像
在idea中为myapp项目创建docker目录与dockerfile文件
为方便管理,修改
pom.xml文件来配置maven打包后的jar包名编写dockerfile文件内容,上传Gitlab仓库
idea中打开myapp项目的pom.xml文件,修改后刷新maven配置
<!-- 在build块中添加finalName配置,此配置为配置构建后的jar包名字 -->
<build>
<finalName>myapp</finalName>
···
</build>
# 镜像基于openjdk 17构建
FROM docker.io/openjdk:17
# 复制构建后的jar包到容器内指定目录
COPY myapp.jar /usr/local/myapp-docker/
# 设置该容器工作目录
WORKDIR /usr/local/myapp-docker/
# 运行目录下的myapp.jar
CMD java -jar myapp.jar
| docker配置 |
|---|
![]() |
![]() |
- 编写docker-compose.yml
编写好dockerfile文件后,我们就可以将Gitlab代码仓库的内容构建成镜像,然后我们通过docker-compose将这个镜像运行成我们需要的容器
所以我们继续在idea项目的docker目录中新建
docker-compose.yml文件,后续通过这个文件的配置将运行dockerfile构建的自定义镜像运行成容器,并做好相关配置
# 指定Compose文件的版本
version: '5.0'
services:
# 自定义的服务名称
myapp:
# 构建镜像的配置
build:
# 指定Docker构建镜像时的根目录
context: ./
# 指定构建镜像使用的Dockerfile文件名
dockerfile: dockerfile
# 构建后的镜像名称和标签
image: myapp:v1.0.0
# 容器的自定义名称
container_name: myapp
# 端口映射
ports:
- 8081:8080
-
然后用idea已经配置好的git推送变更到Gitlab的myapp代码仓库
| 推送变更 |
|---|
![]() |
2.Jenkins配置任务
- 新建任务
在Jenkins主页点击
新建任务输入任务名称myapp-docker并选择构建一个自由风格的项目,最后点击确定源码管理依旧选择
Git,然后Repository URL输入仓库地址http://85.137.247.103:8765/root/myapp.git分支名与Gitlab一致,保存后可以先构建查看日志,验证仓库是否配置成功
| 新建任务 |
|---|
![]() |
![]() |
- 构建项目
在
Build Steps中增加构建步骤,选择调用顶层MAVEN目标
Maven 版本选择为之前全局配置自定义的别名
目标就是maven构建项目的命令:
clean package -DskipTests
| 构建项目 |
|---|
![]() |
我们可以构建一次查看控制台输出验证配置是否正确,首次构建maven会下载相关依赖,可能耗时较长
我们也可以登录Jenkins服务器进入mytest-docker任务工作目录
/var/lib/jenkins/workspace/myapp-docker,发现这里生成了一个target目录,这就是构建后jar包所在路径,可以找到构建好并且已配置命名的jar包myapp.jar
| 构建项目 |
|---|
![]() |
![]() |
- 推送文件
我们之前已经在
Publish Over SSH插件中配置好了目标服务器,所以我们直接增加构建后操作步骤,选择Send build artifacts over SSH,然后选择后端配置好的application服务器,Source files中选择推送target目录中构建好的jar包:target/*.jar以及后续运行容器需要的dockerfile和docker-compose.yml文件:docker/*之后点击构建,登录application服务器验证是否推送成功
| 构建项目 |
|---|
![]() |
![]() |
- 运行成容器
文件推送成功后,我们在
Exec command中写入构建运行容器的命令
因为在
Publish Over SSH中配置的==目标服务器指定目录==Remote Directory是/usr/local/myapp,而使用docker-compose运行容器时,需要当前目录下有docker-compose.yml文件,所以我们先进入docker目录后运行后续命令,为防止歧义用绝对路径:cd /usr/local/myapp/docker然后我们在dockerfile中配置的
COPY myapp.jar /usr/local/myapp-docker/是将当前目录下的myapp.jar复制到容器内,而docker文件夹并无此文件,所以我们需要将上层目录的target目录中的jar包移动到当前目录:mv ../target/*.jar ./然后我们就可以通过
docker-compose up -d --build将我们的自定义镜像构建并且运行起来,但是我们可能会多次构建运行这个容器,所以为避免冲突,我们先停止之前运行的容器:docker-compose down建议先在application服务器运行以下命令,先构建一次镜像
cd /usr/local/myapp/docker
mv ../target/*.jar ./
docker-compose down
docker-compose up -d --build
| 构建项目 |
|---|
![]() |
- 构建任务
-
点击构建,查看日志成功,进入application服务器查看镜像与容器状态
| 构建任务 |
|---|
![]() |
![]() |
3.浏览器访问
-
进入浏览器访问:
http://10.0.0.137:8081/test,访问到与本地测试时一致的页面即为通过Jenkins发布成功
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐





















所有评论(0)