Docker安装Jenkins部署springBoot项目

前言:

1、Jenkins实现打包部署项目是自动化运维部署的基本知识,本章只为学习之用,对熟悉Jenkins流程有一定的帮助。
2、生产上强烈不建议部署Jenkins到Docker容器,切记!

总体流程

1、Jenkins - 2、拉取githup中仓库代码 - 3、打包Maven项目为Docker镜像文件 - 4、上传到目标服务器 - 5、执行目标服务器内的shell脚本,启动Docke容器

安装jdk1.8.0_261到宿主机

此处我们把jdk1.8.0_261安装到/home/calebit/Desktop/soft/jdk18/目录下。

mkdir -p /home/calebit/Desktop/soft/jdk18/
cd /home/calebit/Desktop/soft/jdk18/

下载jdk过程略...

解压步骤略...

例:

unzip xxx.tar.gz
tar -zcxf xxx.tar.gz 

安装 maven3.6.3到宿主机

1、此处我们把maven3.6.3安装到/home/calebit/Desktop/soft/

mkdir -p /home/calebit/Desktop/soft/
cd /home/calebit/Desktop/soft/

2、解压步骤略...

3、配置maven中央仓库地址,进入本地maven解压目录的 配置文件conf目录:

cd /home/calebit/Desktop/soft/apache-maven-3.6.3/conf

4、由于maven默认中央仓库下载比较慢,我们可以更改maven仓库为阿里云中央仓库地址,我们可以 编辑 apache-maven-3.6.3/conf/settings.xml文件, 更改本地仓库地址和增加阿里云中央仓库地址:

cp settings.xml settings.xml_bak 
vim settings.xml 

打开localRepository节点,并且配置仓库目录/mydata/mavenRepository,localRepository 的配置,可以理解成是Maven下载远程仓库的jar包存放到本地仓库的路径,此处配置成/mydata/mavenRepository,后面我们可以通过增加挂载文件夹的方式,来和我们宿主机共享这个仓库。

<localRepository>/mydata/mavenRepository</localRepository>

在mirrors节点下增加以下内容

<mirrors>

    <mirror>
        <id>alimaven</id>
        <mirrorOf>central</mirrorOf>
        <name>aliyun maven</name>
        <url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
    </mirror>
   
</mirrors>

此处为了jenkins打包时候不再去中央仓库拉取jar包,如果我们在我们自己的Idea中打包过我们要发布的SpringBoot项目的话,我们就可以把本地的maven仓库文件(全部文件)上传到宿主机/mydata/mavenRepository 目录下。这样Jenkins打包的时候,就不需要再次去中央仓库拉取需要的jar包了,加快了打包时间,拷贝过程略...


开启Docker Remote API

1、编辑 /lib/systemd/system/docker.service,在ExecStart后开启。

vim  /lib/systemd/system/docker.service 

找到 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock 后面添加-H tcp://0.0.0.0:2375

。。。。。

[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -H tcp://0.0.0.0:2375
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always

。。。。。

2、重新加载配置文件

systemctl daemon-reload 
systemctl restart docker

3、关闭防火墙 或者 开启防火墙的端口

centos 开启防火墙端口:

#关闭防火墙  
systemctl stop firewalld.service 
# 禁止firewall开机启动 
systemctl disable firewalld.service 

# 或者允许固定端口
firewall-cmd --zone=public --add-port=2375/tcp --permanent 
firewall-cmd --reload

ubantu 关闭防火墙

#关闭防火墙
sudo ufw disable
# 或者允许固定端口
sudo ufw allow 2375

#查看防火墙状态
sudo ufw status



以下正文开始...

Docker环境下安装Jenkins

本文自动拉取到的jenkins为Jenkins 2.249.1版本(2020年9月30日)。其他版本过低的话,可能初始化Jenkins插件的时候,会报一些版本过低的错误。会提示你升级Jenkins版本。

1、拉取最新的Jenkins的docker镜像

docker pull jenkins/jenkins:lts

2、 启动Jenkins容器

docker run -p 8080:8080 -p 50000:5000 --name jenkins \
-u root \
-v /mydata/jenkins_home:/var/jenkins_home \
-v /home/calebit/Desktop/soft/apache-maven-3.6.3:/maven/apache-maven-3.6.3 \
-v /home/calebit/Desktop/soft/jdk18/jdk1.8.0_261/:/jdk/jdk1.8.0_261 \
-v /mydata/mavenRepository:/mydata/mavenRepository \
-d jenkins/jenkins:lts

其中:
a、挂载目录/mydata/mavenRepository为后面需要用到的 maven 仓库地址
b、挂载目录/mydata/jenkins_home为 jenkins 安装配置文件地址
c、挂载目录/home/calebit/Desktop/soft/apache-maven-3.6.3 需提前下载好本地maven解压到宿主机/home/calebit/Desktop/soft/apache-maven-3.6.3目录
d、挂载目录/home/calebit/Desktop/soft/jdk18/jdk1.8.0_261/为 宿主机本地jdk目录。需提前下载解压到该目录

3、查看 jenkins初始密码(第一次访问jenkins需要用到这个管理员密码)

docker logs jenkins
## 本次测试,日志中的初始密码为:85d429ac39ee468e9d9d92776ee7c47f

配置jenkins

参考:https://mp.weixin.qq.com/s?__biz=MzU1Nzg4NjgyMw==&mid=2247484270&idx=1&sn=92bc35f7568e061059e58af919e75bde&scene=21#wechat_redirect

1、访问 htttp://192.168.23.135:8080

 Please wait while Jenkins is getting ready to work ...
  Your browser will reload automatically when Jenkins is ready.

等待启动完成,会提示输入管理员密码。此密码通过以下命令查看。

docker logs jenkins 

2、输入日志里面获取的管理员密码:85d429ac39ee468e9d9d92776ee7c47f

3、首次进入jenkins需要下载推荐插件,点击左边第一项【安装推荐的插件】等待过程有点长,请耐心等待...
等待插件下载完成后,进入下一步。

4、创建一个管理员账号 admin / admin..

5、输入实例配置url:htttp://192.168.23.135:8080

6、配置【全局工具配置】
【首页】-【系统管理】-【全局工具配置】-【JDK】-【jdk安装】-【新增JDK】

JDK别名:jdk1.8
JAVA_HOME:/jdk/jdk1.8.0_261

(注意,此处若出现 xxxx is not a directory on the Jenkins master (but perhaps it exists on some agents) 请确保挂载目录是否出错,如果出错,请参考附录内第3条新增挂载目录),如果正确,此处可以不用勾选[自动安装]

同理。下拉该页面,配置 maven
【Maven】-【Maven安装】-【新增Maven】

Maven Name:Maven3.6.3
MAVEN_HOME:/maven/apache-maven-3.6.3

配置完毕,点击【保存】按钮保存。

7、安装ssh 插件
【首页】-【系统管理】-【插件管理】-【可选插件】里面搜索 和安装 Publish Over SSHSSH plugin插件,安装完毕,勾选重启jenkins ,重启即可。

8、配置【系统配置】

【首页】-【系统管理】-【系统配置】-【SSH remote hosts】-[SSH sites]新增加配置ssh登陆凭证
此步骤的主要作用是jenkins 打包镜像后,能够远程去登陆和执行脚本文件

Hostname:192.168.23.135(需要登陆的服务器)
Port:22(ssh登陆端口)
Credentials:登陆账号和密码(此处点击[添加]按钮增加一个)

9、配置【Publish over SSH】
【首页】-【系统管理】-【系统配置】-【Publish over SSH】-[SSH Servers]
SSH Server Name:192.168.23.135(随便起)
Hostname:192.168.23.135
Username:root
Remote Directory: /root
此处用密码登陆,需点击【高级】按钮,勾选【Use password authentication, or use a different key】
Passphrase / Password :root

编辑完成,点击【Test configuration】显示[success]即可,否则请验证密码

准备项目

主备一个SpringBoot项目,项目主要结构如下:

项目源码地址:https://github.com/liuxianzhong/jenkins-docker-demo

pom.xm

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

....

<!-- docker-maven-plugin -->
<plugin>
    <groupId>com.spotify</groupId>
    <artifactId>docker-maven-plugin</artifactId>
    <version>1.0.0</version>
    <executions>
        <execution>
            <id>build-image</id>
            <phase>package</phase>
            <goals>
                <goal>build</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <imageName>docker-demo/${project.artifactId}:${project.version}</imageName>
        <dockerHost>http://192.168.23.135:2375</dockerHost>
        <baseImage>java:8</baseImage>
        <entryPoint>["java", "-jar","/${project.build.finalName}.jar"]
        </entryPoint>
        <resources>
            <resource>
                <targetPath>/</targetPath>
                <directory>${project.build.directory}</directory>
                <include>${project.build.finalName}.jar</include>
            </resource>
        </resources>
    </configuration>
</plugin>

 

根据自己的IP更改 <dockerHost>http://192.168.23.135:2375</dockerHost> 这个IP

DockerController.java

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class DockerController {
    static Log log = LogFactory.getLog(DockerController.class);

    @RequestMapping("/")
    public String index() {
        log.info("Hello Jenkins Docker!");
        return "Hello Jenkins Docker!";
    }

}

配置启动脚本:

新增 jenkins启动容器的脚本文件 jenkins-docker-demo.sh,到 /mydata/sh/目录下

mkdir -p /mydata/sh/
cd /mydata/sh/
vim jenkins-docker-demo.sh

加入以下内容,并且保存

#!/usr/bin/env bash
app_name='jenkins-docker-demo'
docker stop ${app_name}

echo ----stop container success ----
docker rm ${app_name}

echo ----rm container success ----

echo ----clear old images... -----

clearImagesList=$(docker images -f "dangling=true" -q)

if [ ! -n "$clearImagesList" ]; then
    echo "no images need  clean up."
else
    docker rmi $(docker images -f "dangling=true" -q)
    echo "clear old images success"
fi

docker run -p 8990:8990 --name ${app_name} \
-v /etc/localtime:/etc/localtime \
-v /home/developer/app/logs/:/home/developer/app/logs/ \
-d docker-demo/${app_name}:1.0.0

echo ----start container success----

该脚本的主要功能是,自动启动 我们的镜像。

需要赋予jenkins-docker-demo.sh脚本 可执行权限(很重要!,否则SpringBoot能打包上传成镜像,但可能启动不了容器):

chmod +x ./jenkins-docker-demo.sh

为了顺利启动Jenkins,(可能启动Jenkin时报错如下)(很重要!,否则可能启动不了容器):

touch: cannot touch ‘/var/jenkins_home/copy_reference_file.log’: Permission denied
Can not write to /var/jenkins_home/copy_reference_file.log. Wrong volume permissions?

这里是没有权限问题,需要执行:sudo chown -R 1000:1000 /mydata/jenkins_home

Jenkins新建项目

【首页】-【新建任务】-[输入一个任务名称] 下面输入:jenkins-docker-demo , 选择【构建一个自由风格的软件项目】后点击【确定】

[源码管理]-[git]:
Repositories:
Repository URL: https://github.com/liuxianzhong/jenkins-docker-demo.git (笔者可以自己搭建gitlab或者克隆该项目到自己的git仓库)
Credentials: (点击[添加]按钮添加自己的git登陆账号和密码)

【构建】-【增加构建步骤】-【调用顶层Maven目标】

Maven 版本:Maven3.6.3(此处下拉选择之前配置的Maven3.6.3)
目标:package clean

【构建】-【增加构建步骤】-【Execute shell script on remote host using ssh】
SSH site: 下拉选择之前配置的 root@192.168.23.135
Command:/mydata/sh/jenkins-docker-demo.sh(执行脚本路径)

构建

【首页】-【我的视图】-【jenkins-docker-demo】-【立即构建】
查看- [控制台输出] 内日志,提示

Successfully built 53900b85314d
Successfully tagged docker-demo/jenkins-docker-demo:1.0.0
[INFO] Built docker-demo/jenkins-docker-demo:1.0.0
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  30.265 s
[INFO] Finished at: 2020-09-30T02:28:07Z
[INFO] ------------------------------------------------------------------------
[SSH] script:

/mydata/sh/jenkins-docker-demo.sh

[SSH] executing...
Error response from daemon: No such container: jenkins-docker-demo
Error: No such container: jenkins-docker-demo
----stop container success ----
----rm container success ----
----clear old images... -----
no images need  clean up.
50d4402203ef2041a80ad943183113cd9b357f558c1118bdf9044203e8721549
----start container success----

[SSH] completed
[SSH] exit-status: 0

Finished: SUCCESS

访问

访问 http://192.168.23.135:8990/
如果返回:

Hello Jenkins Docker!

则整个部署成功!!

后记:

一、本文章仅供学习之用,生产环境强烈不建议把jenkins部署成docker容器。

二、githup地址:https://github.com/liuxianzhong/jenkins-docker-demo

三、 动态添加挂载目录 到固定的容器id

此处演示把本地的/mydata/mavenRepository目录,挂载到jenkins容器的/mydata/mavenRepository
1、查询到 容器ID

docker ps -a 
#记录 containerID

2、停止docker

systemctl stop docker

3、编辑容器文件hostconfig.json

cd /var/lib/docker/containers/容器id
cp hostconfig.json hostconfig.json_bak
vim hostconfig.json

添加以下内容到节点Binds:[]

,"/mydata/mavenRepository:/mydata/mavenRepository"

:前为宿主机目录,:后为容器目录。

4、编辑容器文件config.v2.json

cp config.v2.json config.v2.json_bak
vim config.v2.json

添加以下内容到节点MountPoints:[]内(最好是格式化成一行,此处是为了好编辑)

,"/mydata/mavenRepository":{
    "Source": "/mydata/mavenRepository",
    "Destination": "/mydata/mavenRepository",
    "RW": true,
    "Name": "",
    "Driver": "",
    "Type": "bind",
    "Propagation": "rprivate",
    "Spec": {
        "Type": "bind",
        "Source": "/mydata/mavenRepository",
        "Target": "/mydata/mavenRepository"
    },
    "SkipMountpointCreation": false
}

5、重启docker

systemctl start docker

四、原文参考地址:

1、 https://mp.weixin.qq.com/s?__biz=MzU1Nzg4NjgyMw==&mid=2247484270&idx=1&sn=92bc35f7568e061059e58af919e75bde&scene=21#wechat_redirect

五、对于自动化运维的东西还很多,目前主流的有K8s + Rancher + Jenkins/Jib的Idea插件+ Harbor + Git/GitLab(webhook:参考https://blog.csdn.net/qq_21768483/article/details/80177920)等等,学无止境。希望本文对正在学习的你有一点点帮助。

六、重复造轮子的工作毫无意义,站在巨人的肩膀上能让人看得更远,我们能做的就是学习、学习、再学习!来,干了这碗鸡汤!!














最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342