美文网首页程序员
Jenkins中无法启动docker daemon的解决和思考

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

作者: 洛子墟 | 来源:发表于2019-04-22 17:09 被阅读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然后再进行操作.

    解决思路

    • 直接使用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服务导致了另外一个问题.
    那就没有资源隔离了,之前完全没有思考过这个问题,结果是发现当资源大量被占用时,部分应用被不断的迁移.

    相关文章

      网友评论

        本文标题:Jenkins中无法启动docker daemon的解决和思考

        本文链接:https://www.haomeiwen.com/subject/lglugqtx.html