Docker容器中运行Jenkins实现自动化部署
前提环境CentOS、Docker环境步骤一、使用Docker拉下jenkins镜像并运行1、在docker上搜索jenkins镜像执行命令:docker search jenkins随便找一个name拉镜像就可以,推荐stars多的,我选的是jenkins/jenkins2、查看本地的docker镜像[root@k8s-master ~]# docker images如图,IMAGE ID为f8
前提环境
CentOS、Docker环境、JDK1.8、Git
步骤
一、使用Docker拉下jenkins镜像并运行
1、在docker上搜索jenkins镜像并拉取
[root@k8s-master ~]# docker search jenkins
随便找一个name拉镜像就可以,推荐stars多的,我选的是jenkins/jenkins
[root@k8s-master ~]# docker pull jenkins/jenkins
2、查看本地的docker镜像
[root@k8s-master ~]# docker images
如图,IMAGE ID为f8452248512b的镜像就是刚拉下来的jenkins镜像
3、运行jenkins镜像
命令主要是为了将宿主机的docker命令挂载到jenkins运行的docker容器中,因为以后jenkins运行shell脚本进行项目的镜像构建和镜像运行,需要用到docker命令。
首先需要新建文件夹,用来挂载docker目录
[root@k8s-master ~]# mkdir -pv /var/jenkins_home
创建后运行修改目录权限(非常重要!!!)
[root@k8s-master ~]# chown -R 1000 /var/jenkins_home
完成后运行下面命令,此处运行的端口号可以根据自己需要修改
[root@k8s-master ~]# docker run --name jenkins -p 8088:8080 -p 50000:50000 \
--restart=always -u root \
-v /var/run/docker.sock:/var/run/docker.sock \
-v $(which docker):/bin/docker \
-v /usr/lib64/libltdl.so.7:/usr/lib/x86_64-linux-gnu/libltdl.so.7 \
-v /var/lib/docker/tmp:/var/lib/docker/tmp \
-v /var/jenkins_home:/var/jenkins_home \
-d jenkins/jenkins
参数说明:部分摘自(https://www.jianshu.com/p/8b72eece7df8)
--restart=always #Docker重启后该容器也为随之重启
-u root
#以root的身份去运行镜像(避免在容器中调用Docker命令没有权限)
#最好使用docker用户去运行
-v $(which docker):/bin/docker
#将宿主机的docker命令挂载到容器中
#可以使用which docker命令查看具体位置
-v /var/run/docker.sock:/var/run/docker.sock
#容器中的进程可以通过它与Docker守护进程进行通信
-v /usr/lib64/libltdl.so.7:/usr/lib/x86_64-linux-gnu/libltdl.so.7
#libltdl.so.7是Docker命令执行所依赖的函数库
#容器中library的默认目录是 /usr/lib/x86_64-linux-gnu/
#把宿主机的libltdl.so.7 函数库挂载到该目录即可
#可以通过whereis libltdl.so.7命令查看具体位置
#centos7位置/usr/lib64/libltdl.so.7
#ubuntu位置/usr/lib/x86_64-linux-gnu/libltdl.so.7
-v /var/jenkins_home:/var/jenkins_home
#将运行的docker镜像目录挂载到本地的/var/jenkins_home
4、查看已运行的jenkins容器
[root@k8s-master ~]# docker ps
5、进入容器内部测试docker命令和系统命令等是否好使
[root@k8s-master ~]# docker exec -it 8bf12b05305e bash
输入上面的命令进入到容器内部后分别执行:
root@8bf12b05305e:/# docker -v
root@8bf12b05305e:/# ls
如果可以那么恭喜你完成了第一步!!!
二、配置Jenkins
打开浏览器访问:http://[你的ip地址]:[你的Docker容器映射的端口号]
等待jenkins初始化加载完成
这个密码的位置在映射的宿主机地址/var/jenkins_home/secrets/initialAdminPassword
里
进去之后出现插件页面,可以安装推荐的插件或者选择安装自己需要的插件,这里点选择安装自己需要的插件后点击全不选跳过插件安装(以后可以在jenkins主页面进行插件选择安装)
插件页面结束后进入创建管理员账号界面,这里可以根据需要进行账号创建,我的选择是使用admin账户继续(如果有需要之后也可以新建用户)
进入jenkins主页面
1、插件安装
a、安装Maven Integration插件
点击左侧Manage Jenkins后选择Manage Plugins,选择Available后在搜索框中输入Maven Integration勾选并点击Install without restart。
b、安装GitLab插件
其他插件可以根据自己的需要安装,我这里安装的两个插件就已经可以从gitlab上拉下springboot项目的代码并构建了,如果不知道还需要安装什么插件,可以看看https://www.cnblogs.com/zhanglianghhh/archive/2018/10/11/9770529.html这位博主的博客
错误:
如果插件下载安装失败,需要更换更新网站,选择高级选项并更改Update Site
站点URL从:https://updates.jenkins.io/update-center.json改为如下地址
http://mirror.xmission.com/jenkins/updates/update-center.json
也可https去掉s更换为
http://updates.jenkins.io/update-center.json
实在不行百度吧,还有很多地址也可以换换试试
等待插件安装完成
2、配置全局环境变量
添加全局环境变量
Name:GIT_SSL_NO_VERIFY
Value:true
Name:PATH
Value:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
3、配置全局工具地址
a、配置JDK路径
首先通过命令进入容器内
[root@k8s-master ~]# docker exec -it 8bf12b05305e bash
输入echo $JAVA_HOME
root@8bf12b05305e:/# echo $JAVA_HOME
配置的JDK Name随便取,JAVA_HOME路径为上面命令获取的路径
b、配置git路径
在容器内继续输入which git,并配置git路径
root@8bf12b05305e:/# which git
小贴士:退出容器可以使用ctrl+p+q
c、配置Maven路径
这里选择让maven自动安装
到这里第二步就完成了!!!
三、配置Git仓库拉代码构建
1、回到Jenkins主界面选择左侧New Item,输入名字并选择构建一个maven项目
2、配置git地址
3、配置打包命令
4、添加构建完成后执行的shell命令
流程解析:项目构建完成后是war包,shell命令的作用是将此项目原来的docker容器停止并删除,然后将此项目的镜像也删除,之后将war包进行镜像构建并运行.
ps:项目在容器中运行可能会报错
错误提示: timezone region not found
错误原因:docker 容器内时区不是 CST 导致
解决办法:在dockerfile 中增加一下命令
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
下面是我的shell脚本(Dockerfile也在这里面创建),都有注释可以根据需要修改
#!/bin/bash
#1.2.3.4需要根据不同项目修改不同值
#1.服务名称
SERVER_NAME=demo
#2.启动dev配置文件
CONFIG_NAME=dev
#3.源war路径,mvn打包完成之后,target目录下的war包或jar包名称(包含后缀)
JAR_NAME=demo-0.0.1-SNAPSHOT.war
#4.端口
PORT=8088
# 源war路径
#/usr/local/jenkins_home/workspace--->jenkins 工作目录
#demo 项目目录
#target 打包生成jar包的目录
JAR_PATH=/var/jenkins_home/workspace/$SERVER_NAME/target
#创建createImages和demo文件夹
mkdir -pv /var/jenkins_home/createImages/$SERVER_NAME
#在demo文件夹下创建Dockerfile文本文件
touch /var/jenkins_home/createImages/$SERVER_NAME/Dockerfile
#写入Dockerfile
cat >>/var/jenkins_home/createImages/$SERVER_NAME/Dockerfile<<EOF
FROM java:8
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
ADD $JAR_NAME $SERVER_NAME
ENTRYPOINT ["java","-jar","$SERVER_NAME","--spring.profiles.active=$CONFIG_NAME"]
EOF
# 打包完成之后,把war包移动到创建Docker镜像的目录(此目录包含Dockerfile文件)--->createImages,demo这两个目录需要自己提前创建(上面已经提前创建了)
JAR_WORK_PATH=/var/jenkins_home/createImages/$SERVER_NAME
echo "查询$SERVER_NAME的容器id"
DOCKER_ID=`docker ps -aqf name="$SERVER_NAME"`
echo "得到容器ID:$DOCKER_ID"
echo "stop $DOCKER_ID"
docker stop $DOCKER_ID
echo "rm $DOCKER_ID"
docker rm $DOCKER_ID
echo "查询$SERVER_NAME的镜像id"
IMAGES_ID=`docker images -q $SERVER_NAME`
echo "得到镜像ID:$IMAGES_ID"
echo "rmi $IMAGES_ID"
docker rmi $IMAGES_ID
echo "停止并清除镜像完成,进入创建新镜像过程"
echo "复制war包到/createImages/demo目录下"
#复制war包到/createImages/demo目录下
cp $JAR_PATH/$JAR_NAME $JAR_WORK_PATH
#切换到demo创建镜像文件夹目录下
cd $JAR_WORK_PATH
#修改文件权限
chmod 755 $JAR_NAME
echo "执行命令创建新镜像"
#执行docker创建镜像命令
docker build -t $SERVER_NAME .
#删除Dockerfile文本文件
rm /var/jenkins_home/createImages/$SERVER_NAME/Dockerfile
#运行镜像
docker run -d -p $PORT:$PORT --restart=always -u root --name $SERVER_NAME $SERVER_NAME
echo "运行新镜像,流程完毕,端口号为:$PORT"
四、构建并测试
回到Jenkins主界面并点击按钮构建,然后进入构建日志,至此整个流程就完成了!!!
附:
1、jenkins重新初始化admin
https://www.cnblogs.com/wukc/p/13384595.html
2、在jenkins提交保存配置时有时候会报403,这个应该在Configure global security里勾选csrf兼容
更多推荐
所有评论(0)