程序员

Jenkins中无法启动docker daemon的解决和思考

2019-04-22  本文已影响0人  洛子墟

changelog:

  • [2019-04-23] 更新push镜像失败
  • [2019-11-02] 追加遇到资源隔离问题

Jenkins中无法启动docker daemon的解决和思考

背景

原有CI流程中构建包是使用Jenkins,构建docker镜像是在某台机器上使用docker的API,现在为了提高机器的使用率和速度,合并在Jenkins上完成.

环境

自己封装了一层portal应用.
CI调用的是Jenkins的API.
Jenkins集群使用了Jenkins master加上k8s启动Jenkins slave.

问题

最后测试的时候才发现问题,docker daemon无法启动,自己坑自己啊!
虽然制作Jenkins的slave镜像的时候已经成功安装docker命令,但是没有去尝试命令,太想当然的以为肯定能成功.
原因是docker build命令需要依赖daemon,打包需要依赖的文件需要传递到docker.sock然后再进行操作.

解决思路

systemctl start docker
报错内容:Failed to get D-Bus connection: Operation not permitted。
daemon无法启动时因为dbus-daemon无法启动
使用网上方案启动增加--privileged参数,成功解决.

[root@e1534602a3a3 ~]# systemctl status

docker.service
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
   Active: failed (Result: exit-code) since Mon 2019-04-22 14:49:17 CST; 6min ago
     Docs: http://docs.docker.com
  Process: 2912 ExecStart=/usr/bin/dockerd-current --add-runtime docker-runc=/usr/libexec/docker/docker-runc-current --default-runtime=docker-runc --exec-opt native.cgroupdriver=systemd --userland-proxy-path=/usr/libexec/docker/docker-proxy-current --init-path=/usr/libexec/docker/docker-init-current --seccomp-profile=/etc/docker/seccomp.json $OPTIONS $DOCKER_STORAGE_OPTIONS $DOCKER_NETWORK_OPTIONS $ADD_REGISTRY $BLOCK_REGISTRY $INSECURE_REGISTRY $REGISTRIES (code=exited, status=1/FAILURE)
 Main PID: 2912 (code=exited, status=1/FAILURE)

无解了,连方向都没有了.

[root@e1534602a3a3 ~]#dockerd

ERRO[0001] 'overlay2' is not supported over overlayfs   
ERRO[0001] 'overlay' is not supported over overlayfs    
ERRO[0001] There are no more loopback devices available. 
Error starting daemon: error initializing graphdriver: loopback attach failed   

更加坑了,原来这个是网络问题.
这下又无解了,docker启动实例中再启动一层网络,感觉自己的技术实例无法解决.
面向baidu和google也没有解决方案.

Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

增加了一行参数-v /var/run/docker.sock:/var/run/docker.sock,问题解决了.
但是还是需要当心,相当于2个不同的业务使用了一个数据库,后续要观察一下是否有额外的影响.

[2019-04-23]更新

push fails: 'denied: requested access to the resource is denied'

解决方案很简单
jenkins slave直接使用宿主机docker文件,多增加了一个参数
-v $(which docker):/usr/bin/docker

*又遇到一个小问题,缺少公共lib包

docker: error while loading shared libraries: libltdl.so.7: cannot open shared object file: No such file or directory

继续共享宿主机的lib包
-v /usr/lib64/libltdl.so.7:/usr/lib64/libltdl.so.7

[2019-11-02]资源隔离问题

不可能为了ci 单独部署和维护一套kubernetes系统,所以我们测试环境是使用一套的k8s系统.(包含应用的sit\pre环境以及一些公共组件)
那么问题来了复用了主机上的docker服务导致了另外一个问题.
那就没有资源隔离了,之前完全没有思考过这个问题,结果是发现当资源大量被占用时,部分应用被不断的迁移.

上一篇 下一篇

猜你喜欢

热点阅读