K8S笔记-29-使用jenkis自动化构建docker
一、目标K8s环境下,使用jenkins自动化构建docker使用yum方式安装的jenkins的默认工作目录/var/lib/jenkins/workspace二、平台[root@kahn.xiao ~]# uname -r3.10.0-957.el7.x86_64[root@kahn.xiao ~]# cat /etc/redhat-releaseCentOS Linux...
一、目标
K8s环境下,使用jenkins自动化构建docker
使用yum方式安装的jenkins的默认工作目录/var/lib/jenkins/workspace
二、平台
[root@kahn.xiao ~]# uname -r
3.10.0-957.el7.x86_64
[root@kahn.xiao ~]# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
各主机规划:
主机名 IP 角色 端口
k8s-master 10.100.100.11 master,node api-server:8080
k8s-node1 10.100.100.12 node,jenkins tomcat:8080
k8s-node2 10.100.100.13 node,gitlab gitlab:80,8080
三、写dockerfile
1.隔两天没玩这东西有点懵了,回忆一下之前安装gitlab是在节点2服务器上,然后还在节点2服务器上推送测试代码到项目xk8s01,(参考帖子《K8S笔记-27-gitlab的安装和代码上传》https://blog.csdn.net/xoofly/article/details/104232583)
2.到节点2服务器,进到项目目录
[root@k8s-node2 xgitlabcode]# cd /opt/xgitlabcode
[root@k8s-node2 xgitlabcode]# ls
index.html kahn.html songshuer.jpg
3.制作一个dockerfile
镜像用之前上传到私有库的那个nginx:1.13,然后添加当前目录下的所有文件到<镜像的/usr/share/nginx/html目录下>;
[root@k8s-node1 xdockerfile]# vim dockerfile
FROM 10.100.100.11:5000/NGINX:1.13
ADD . /usr/share/nginx/html
4.制作一个Git的忽略文件<.dockerignore>,避免将文件<dockerfile>上传到gitlab服务器
[root@k8s-node2 xgitlabcode]# vi .dockerignore
dockerfile
5.将项目制作成镜像
[root@k8s-node2 xgitlabcode]# docker build -t kahnweb:v1 .
#注释: kahnweb是自定义镜像名,:V1是版本号, .代表当前目录
6.查询一下是否已经有这个镜像了
[root@k8s-node2 xgitlabcode]# docker images |grep kahnweb
7.利用刚才生成的镜像来启动成容器
[root@k8s-node2 xgitlabcode]# docker run -d -p 88:80 kahnweb:v1
#注释:运行容器,暴露端口88映射到容器的nginx80端口,镜像使用钢材制作的kahnweb:v1
8.查看容器是否启动成功
[root@k8s-node2 xgitlabcode]# docker ps |grep kahnweb
6bf0993a0ea3 kahnweb:v1 "nginx -g 'daemon ..." 18minutes ago Up 18minutes 0.0.0.0:88->80/tcp peaceful_thompson
9.使用物理机浏览器访问这个容器的nginx页面
浏览器访问:http://10.100.100.13:88/
浏览器访问:http://10.100.100.13:88/kahn.html
浏览器访问:
10.提交代码到gitlab仓库
#添加当前目录下的所有文件
[root@k8s-node2 xgitlabcode]# git add .
#将暂存区的所有文件提交到本地库
[root@k8s-node2 xgitlabcode]# git commit -m "first update by kahn 202002102343"
#将本地库的代码推送到远程master分支上
[root@k8s-node2 xgitlabcode]# git push -u origin master
#接下来会提示让输入gitlab的用户名:root,再输入密码。
11.在Gitlab上代码库是否已更新
回到gitlab页面http://10.100.100.13/,找到项目xk8s01项目,看下已经有刚才创建的那两个代码上传上来了。(感觉那个.dockerignore没起作用,估计写的有问题)
四、使用jenkins自动化构建docker
1.打开jenkins,找到上一次创建的jenkins项目<kahn01-freestyle>,然后点【配置】
2.在【构建】区域中的【执行 shell】中写两行内容(本次只保留两行)
docker build -t 10.100.100.11:5000/kahnweb:v1 .
docker push 10.100.100.11:5000/kahnweb:v1
3.第一次构建docker(失败了)
回到jenkins项目主页,然后点【立即构建】。
Duang》。。执行失败了,看看下面这段提示【+ docker build -t 10.100.100.11:5000/kahnweb:v1 . Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post 】,猜测是jenkins没有权限执行docker命令。再猜测一下使用yum方式安装的jenkins的默认启动账号是自动创建的jenkins,所以服务器系统账号jenkins是无法执行docker命令的。
4.解决jenkins执行构建docker时报权限被拒绝的问题。
方法1:修改jenkins的启动账号为root
[root@k8s-node1 ~]# sed -i 's#JENKINS_USER="jenkins"#JENKINS_USER="root"#' /etc/sysconfig/jenkins
[root@k8s-node1 ~]# systemctl restart jenkins
方法2:修改/etc/sudoers文件,让jenkins拥有执行所有命令的权限(不过这挺危险,最后只允许它执行特定的命令,如docker build...)
[root@k8s-node1 jenkins]# vim /etc/sudoers
#将下面一行内容加到【root ALL=(ALL) ALL】这行下面,然后wq!强制保存退出
jenkins ALL=(ALL) ALL
方法3:网上有网友说把jenkins的代码目录的属主改成jenkins,看起来不是太靠谱,就没试。
5.再次使用jenkins构建docker镜像,并推送代码到私有docker仓库(成功了)
6.验证一下是否将镜像推送到了私有仓库
[root@k8s-node1 jenkins]# docker images |grep kahnweb
#10.100.100.11:5000/kahnweb v1 383e2eee3a37 30 minutes ago 109 MB
五、使用jenkins自动化构建docker可变化版本号的镜像
接着上面的操作。
1.修改jenkins项目中的【构建】,
之前构建的主要代码中的v1改成v$BUILD_ID,如下所示:
【docker build -t 10.100.100.11:5000/kahnweb:v$BUILD_ID .】
【docker push 10.100.100.11:5000/kahnweb:v$BUILD_ID】
这样做的目的就是,每当我们执行构建的时候,就让docker的镜像版本号也变化一下(不变化的话怎么实现代码的更新呢?),这个$BUILD_ID貌似就是jenkins构建时的状态球前的序号。
点【保存】。
2.构建刚才修改后的jenkins项目
回到jenkins项目主页,然后点【立即构建】,正常的话项目会执行成功,下方有个蓝球,点一下它旁边的三角,然后再点【控制台输出】,这样是为了我们接下来看构建的详细过程。
在控制台输出的日志里,我们发现【docker build -t 10.100.100.11:5000/kahnweb:v16 .】的版本号正好就是执行构建jenkins项目的序号,这正是我们想要的结果。
也由此得出结论:$BUILD_ID就是jenkins构建的序号。
3.再回到docker私有库上看一下镜像是否被推送上来了,而且版本是v16.
[root@k8s-master ~]# ls /opt/myregistry/docker/registry/v2/repositories/kahnweb/_manifests/tags/
=====================================================================================
4.实现较完美的jenkins自动化构建docker镜像(若gitlab上的代码没变化,那及时你点构建也是调过的,直到gitlab上代码发生变化,那么jenkins构建项目才会执行构建的动作)
打开jenkins的本次项目,然后配置项目【构建】【执行shell】,在命令文本框中输入以下内容,最后点保存。
#!/bin/bash
if [ $GIT_PREVIOUS_SUCCESSFUL_COMMIT == $GIT_COMMIT ];then
echo "code no change, skip build"
exit 0
else
docker build -t 10.100.100.11:5000/kahnweb:v$BUILD_ID .
docker push 10.100.100.11:5000/kahnweb:v$BUILD_ID
echo "kahn, The code has chaged and the build was successful !"
fi
5.然后再去jenkins上构建一次本项目
看本次构建的输出结果,日志中显示【code no change, skip build .Finished: SUCCESS】,这正是我们要的效果。
6.去gitlab服务器上(实际无所谓你在哪个主机上)去修改并提交之前项目的代码
[root@k8s-node2 xgitlabcode]# echo "Hello kahn, with jenkis auto build docker image, 2020-02-11_17-26" >/opt/xgitlabcode/index.html
[root@k8s-node2 xgitlabcode]# git add .
[root@k8s-node2 xgitlabcode]# git commit -m "第二次提交代码,让jenkins去自动构建docker镜像"
[root@k8s-node2 xgitlabcode]# git push -u origin master
7.再回到jenkins上【立即构建】一次本项目
8.可再去主控节点上的docker私有库上看是否有新的docker镜像版本号生成
非常完美!2020年2月11日17:36:00
----------------------------------------------------------------------------------------------------------------------------------------------
虽然我也是个屌丝,但写博客真的不容易,愿意公开的没坑的博客更是不多,希望我的帖子对你有用。
我这里贴个支付宝的二维码(抵制辣鸡麻花疼wx),随意打赏,谢谢各位看官!
更多推荐
所有评论(0)