首先我们需要在agent pod中完成编译,构建镜像,推送镜像,kubectl触发更新。显然我们需要把需要的工具打包成容器镜像,基础镜像为了方便选择了centos7的镜像。
在构建jenkins-agent 镜像时却遇到了几个问题。
镜像中可以使用docker 吗?
[root@4e1e6d1c770d /]# docker ps
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
[root@4e1e6d1c770d /]# systemctl start docker
Failed to get D-Bus connection: Operation not permitted
在我尝试启动docker服务的时候却报错了
但是问题来了:Failed to get D-Bus connection: Operation not permitted
这个问题从字面意思是:无法获取D总线连接:不允许操作
于是去网上查
那就给他权限执行一下
[root@base4 ~]# docker exec -it f2386757dccef bash
[root@f2386757dcce /]# docker ps
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
[root@f2386757dcce /]# systemctl start docker
Job for docker.service failed because the control process exited with error code. See "systemctl status docker.service" and "journalctl -xe" for details.
这时候我的心是崩溃的。后面询问大佬才知道,容器里不能虚拟容器了,这里违背常理的
那我就知道了
[root@base4 ~]# docker run -itd -v /var/run/docker.sock:/var/run/docker.sock jenkins/build-tools
jenkins/build-tools jenkins/build-tools:v3 jenkins/build-tools:v5 jenkins/build-tools:v7
jenkins/build-tools:v1 jenkins/build-tools:v4 jenkins/build-tools:v6
[root@base4 ~]# docker run -itd -v /var/run/docker.sock:/var/run/docker.sock jenkins/build-tools:v
v1 v3 v4 v5 v6 v7
[root@base4 ~]# docker run -itd -v /var/run/docker.sock:/var/run/docker.sock jenkins/build-tools:v1
ffbb25b7ab2941339b192aa36f406c35b790fc8c4ee48f97f989234909b17f7f
[root@base4 ~]# docker exec -it ffbb25b7ab29 bash
[root@ffbb25b7ab29 /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ffbb25b7ab29 jenkins/build-tools:v1 "bash" 12 seconds ago Up 11 seconds quizzical_euclid
f2386757dcce jenkins/build-tools:v1 "init" 6 minutes ago Up 5 minutes nervous_herschel
ba1461878116 centos "init" 7 minutes ago Up 7 minutes eloquent_bassi
这样问题确实解决了,但新的问题又出现了。
我们的k8s集群使用的时腾讯云的弹性集群,没有docker.sock文件可以挂载呀,这怎么办?
解决方案一
我在想docker有没有api之类的,本机开通api,让其他机器调用
查看官网得知,docker确实是有Remote API,但是默认没有打开
编辑vim /usr/lib/systemd/system/docker.service
在ExecStart=/usr/bin/dockerd 后增加-H=tcp://0.0.0.0:2375
增加后:
重启服务
sudo systemctl daemon-reload
sudo service docker restart
检查端口
如何使用:
docker -H 10.2.0.3:2375 ps
-H 指定docker 的地址
进入容器测试:
docker -H 10.2.0.3:2375 ps
解决方案二
当我把这个问题告诉了我之前一起学习的同学,他一下子就想到了解决方案。什么docker on docker ,docker in docker. 一些我没听过的东西。最后他告诉我是有现成的开源工具不需要依赖docker 守护镜像就可以完成镜像构建的.在cicd这块完全可以代替docker 完成 pull,push,build等操作。
工具如下
GitHub - genuinetools/img:独立、无守护进程、非特权 Dockerfile 和 OCI 兼容容器映像生成器。
在Release这里可以下载到最新的包
可以通过介绍中的命令一键安装到你的系统中
使用上完全兼容docker 的命令
拉取镜像
./img-linux-amd64 pull nginx
修改tag
./img-linux-amd64 tag nginx:latest nginx:v1