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然后再进行操作.
解决思路
- 直接使用init,然后再启动docker daemon
systemctl start docker
报错内容:Failed to get D-Bus connection: Operation not permitted。
daemon无法启动时因为dbus-daemon无法启动
使用网上方案启动增加--privileged参数,成功解决.
- 但是在启动docker daemon的时候报错了
[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)
无解了,连方向都没有了.
- 换一个思路,直接调用dockerd的命令,看看结果
[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?
- 那如果我使用宿主机的docker.sock文件是否可行?
- 直接挂载?
增加了一行参数-v /var/run/docker.sock:/var/run/docker.sock,问题解决了.
但是还是需要当心,相当于2个不同的业务使用了一个数据库,后续要观察一下是否有额外的影响.
[2019-04-23]更新
- 果然还是遇到问题了,在内部push镜像失败
push fails: 'denied: requested access to the resource is denied'
- 按照baidu和google的说法是没有docker login和docker tag问题,但是都一一排除了
- 按照docker login的原理,查看了~/.docker/confg文件,也是正常的,权限也都是root,也被排除
- 最后的最后发现可能居然是版本兼容问题
- 宿主机使用的docker是17.12.1-ce,而jenkins slave内置的docker版本是1.13.1,导致了很莫名的错误
解决方案很简单
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
- 所有的坑都填上了,CI部分顺利收工!
[2019-11-02]资源隔离问题
不可能为了ci 单独部署和维护一套
kubernetes
系统,所以我们测试环境是使用一套的k8s系统.(包含应用的sit\pre环境以及一些公共组件)
那么问题来了复用了主机上的docker服务导致了另外一个问题.
那就没有资源隔离了,之前完全没有思考过这个问题,结果是发现当资源大量被占用时,部分应用被不断的迁移.
网友评论