docker部署jenkins并成功自动化部署微服务

一、环境版本清单:

  1. docker 26.1.4
  2. JDK 17.0.28
  3. Mysql 8.0.27
  4. Redis 6.0.5
  5. nacos 2.5.1
  6. maven 3.8.8
  7. jenkins 2.492.2

二、服务架构:有gateway,archives,system这三个服务

三、部署步骤

四、安装linux

五、在linux上安装redis,nacos,mysql, maven

六、安装docker-ce

可以参考这个文章 Linux安装最新版Docker完整教程(建议收藏)_linux安装docker教程-CSDN博客

七、使用docker部署安装jenkins

可以参考这个文章

【Docker安装Jenkins打包SpringBoot应用为docker镜像并运行】_jenkins打包docker镜像-CSDN博客

#创建jenkins_home数据挂载目录

mkdir /usr/local/jenkins_home

#赋值权限,否则后慢慢挂载会失败,这里我们给最高权限

chmod -R 777 /usr/local/jenkins_home

#拉取jenkins镜像

docker pull jenkins/jenkins:lts

#启动jenkins容器

docker run -d --name=jenkins -p 8080:8080 --privileged=true \

-v /usr/local/jenkins_home:/var/jenkins_home \

-v /usr/local/java/jdk-17.0.12:/usr/local/java/jdk-17.0.12 \

-v /usr/local/apache-maven-3.8.8:/usr/local/apache-maven-3.8.8 \

-v $(which docker):/usr/bin/docker \

-v /var/run/docker.sock:/var/run/docker.sock jenkins/jenkins:lts

#授予docker的操作权限给jenkins等容器使用

chmod a+rw /var/run/docker.sock
参数说明:

-v /usr/local/jenkins_home:/var/jenkins_home:是对容器内存储Jenkins的一些配置信息的文件夹

-v /usr/local/java/jdk-17.0.12:/usr/local/java/jdk-17.0.12 :是把linux下的jdk和容器内的关联(配置Jenkins时使用)

-v /usr/local/apache-maven-3.8.8:/usr/local/apache-maven-3.8.8:是把linux下的maven和容器内的关联(配置Jenkins时使用)

-v $(which docker):/usr/bin/docker:是把linux下的docker和容器内的关联

-v /var/run/docker.sock:/var/run/docker.sock:是可以在Jenkins容器里使用我们Linux下的docker

其中容易踩坑的是:授予docker的操作权限给jenkins等容器使用,如果不赋予权限,后面在jenkins中使用shell脚本执行docker命令时,会报没有权限执行docker命令

复制代码
#授予docker的操作权限给jenkins等容器使用
chmod a+rw /var/run/docker.sock

后面就开始部署项目,其中容易踩坑的就是,shell脚本和Dockerfile文件

首先,我们已经将 Linux 上的 jenkins_home 目录挂载到了 Jenkins 容器内,作为数据卷。这意味着 Jenkins 容器使用这个目录来存储其所有数据,包括构建后的 Java 程序包。通过这种方式,我们可以确保 Jenkins 容器内的 jenkins_home 目录与主机上的对应目录保持同步。因此,在部署过程中,Java 应用程序会在 Jenkins 容器中的 jenkins_home 目录下被打包,并且由于该目录被挂载到 Linux 主机上,我们可以在主机上直接访问这些打包好的文件。接下来,让我们看一下打包后我们的服务架构是如何组织的。

从上面可以看到默认工作目录是jenkins_home/workspace/项目名称(jenkins新建任务时的项目名称)

首先要明白一件事,就是我们有是微服务,那就会有很多个服务,难道要为每一个服务都重新从git上拉代码,打包,发布吗?那肯定是不对的,因为jenkins会对每一个任务都进行打包,那么这个workspace目录下就会多很多个只是名字不一样但是内容一模一样的目录,就会导致内存不足。

所以我想到一个解决方法就是,先新建一个jenkins任务使用maven打包但不执行shell脚本,也就是 上面的 lx-root,然后再为每一个服务新建一个任务不打包,只去执行shell脚本运行上面已经打包好的jar包。

步骤:先执行 lx-root 再执行别的服务

shell脚本:

java 复制代码
#!/bin/bash
# 服务名称
SERVER_NAME=lx-modules-archives
echo $JAVA_HOME
java -version
# 源jar名称,mvn打包之后,target目录下的jar包名称
JAR_NAME=lx-modules-archives
# jenkins下的我们要执行的目录,target上一级目录
JENKINS_HOME=/var/jenkins_home/workspace/lx-root/lx-modules/lx-modules-archives
# 等待三秒
echo sleep 3s
sleep 1
echo sleep 2s
sleep 1
echo sleep 1s
sleep 1
echo "结束进程完成"
cd $JENKINS_HOME/target
cp $JENKINS_HOME/Dockerfile $JENKINS_HOME/target
# 修改文件权限
chmod 755 $JAR_NAME.jar
echo "看看docker能不能用"
docker -v
echo "停止容器"
# 停止容器
docker stop $SERVER_NAME
echo "删除容器"
# 删除容器
docker rm $SERVER_NAME
echo "删除镜像"
# 删除镜像
docker rmi $SERVER_NAME
echo "打包镜像"
# 打包镜像
docker build -t "$SERVER_NAME" .
echo "运行镜像"
# 运行镜像
docker run -d --network host --name ${SERVER_NAME} $SERVER_NAME

Dockerfile:

java 复制代码
FROM openjdk:17
# 设置维护者信息(可选)
LABEL maintainer="lx"
# 设置工作目录
WORKDIR /app

# 将当前目录下的 jar 包复制到容器中的 /app 目录下
COPY lx-modules-archives.jar /app/lx-modules-archives.jar

# 暴露应用程序运行时的端口(这里假设你的 Spring Boot 应用监听的是 9999 端口)
EXPOSE 9302

# 定义环境变量(可选)
ENV JAVA_OPTS=""

# 启动应用
ENTRYPOINT ["sh", "-c", "java -jar /app/lx-modules-archives.jar"]

注意点一、 需要注意的是,shell脚本里我们已经使用 cd $JENKINS_HOME/target 进入了 target 目录,后面在Dockerfile里使用COPY lx-modules-archives.jar /app/lx-modules-archives.jar 时,要直接使用COPY lx-modules-archives.ja 而不需要 COPY /target/lx-modules-archives.jar,否则会找到jar包。

**注意点二、**还有一个注意点是我在运行我们build好的镜像之后

运行镜像

docker run -d --network host --name {SERVER_NAME} SERVER_NAME

运行镜像加了一个 --network host,这个主要是为了让docker容器和linux使用同一个网络通信,不使用端口映射。为什么要这样呢?

因为我在配置文件里连接nacos和redis写的127.0.0.1,那么docker在运行我们的服务时就会连接本地,但是我没在docker容器内部部署nacos和redis,而是部署在了linux上,而linux和nacos默认使用的是不同的网络,默认是桥接模式。

因为我们知道正常运行容器时 docker run -d --name=jenkins -p 8080:8080 使用的是端口映射的方式进行类似反向代理的功能,实际上网络还是不通信的。

详细的可以看下这个文章

详解Docker的网络模式之host模式(host网络模式)_docker host网络-CSDN博客

**注意点三、**我们在启动服务时连接nacos可能会出现超时现象,发现8848端口也开放防火墙了,

从日志看到有一个9848的端口也一直报错,所有把9848端口也开放防火墙就可以了

firewall-cmd --permanent --add-port=9848/tcp

八、效果预览

相关推荐
java_logo43 分钟前
Dify 开源 LLM 应用开发平台企业级 Docker Compose 部署手册
docker·容器·开源·dify部署·dify部署文档·dify部署方案·dify部署教程
北京耐用通信1 小时前
耐达讯自动化CANopen转Profibus网关在矿山机械RFID读写器应用中的技术分析
人工智能·科技·物联网·自动化·信息与通信
jarreyer2 小时前
【docker的gpu加速相关问题解决记录】
运维·docker·容器
韭菜钟2 小时前
制作自定义Docker镜像并部署使用
运维·docker·容器
椰汁菠萝2 小时前
docker部署gitlab
docker·容器·gitlab
知识分享小能手2 小时前
Ubuntu入门学习教程,从入门到精通,Ubuntu 22.04 中安装 Docker 容器 —— 知识点详解(26)
学习·ubuntu·docker
Knight_AL2 小时前
使用 Docker 快速安装 GitLab(CentOS)
docker·centos·gitlab
米高梅狮子2 小时前
01-Ansible 自动化介绍
运维·自动化·ansible
Gofarlic_OMS3 小时前
ANSYS许可证使用合规性报告自动化生成方案
大数据·运维·人工智能·3d·自动化·云计算
骆驼爱记录3 小时前
Word尾注添加全攻略
自动化·wps·新人首发