【问题标题】:Is there a way to mount docker socket from one to container to another?有没有办法将 docker socket 从一个容器安装到另一个容器?
【发布时间】:2018-03-05 21:15:38
【问题描述】:

我希望在不涉及主机的情况下将 docker socket 从一个容器安装到另一个容器。可能吗?我四处寻找,找不到这种情况的例子。问题是主机使用了一个非常旧版本的 docker,所以我在容器中设置了 docker,它可以正常工作。现在我需要其他 docker 容器来使用来自基本容器而不是主机的套接字。有没有办法实现这一点(在 kubernetes 中)?

【问题讨论】:

    标签: sockets docker kubernetes


    【解决方案1】:

    想到的唯一方法是使用类型为 socket 的 hostPath 卷,并将其挂载到多个容器中: https://kubernetes.io/docs/concepts/storage/volumes/#hostpath

    即使它有效,您最终也会在“较新的 docker”容器中启动“其他容器”容器,这不是一个好习惯。我建议使用较新的 docker 旋转另一个节点,将其连接到您的主节点,然后旋转需要访问 docker sock 的部分负载。您可以使用 nodeSelector 来正确安排: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#step-two-add-a-nodeselector-field-to-your-pod-configuration

    您可以通过将您的控制容器转换为操作员https://www.slideshare.net/Jakobkaralus/the-kubernetes-operator-pattern-containerconf-nov-2017 将其进一步移植到 k8s 上(使用 k8s API 而不是 docker sock)

    【讨论】:

    • 我尝试了 hostpath 方法,但它导致容器在循环中崩溃。 (我刚刚在 root 拥有的主机上创建了一个套接字并安装在容器内。) pod 日志返回“无法创建 unix 套接字 /var/run/docker.sock:设备或资源忙”。有什么想法吗?
    • 我认为发生的事情是,当我创建一个套接字并使用 hostPath 挂载它时,容器内已经有一个套接字,所以当我运行 dockerd 时,它会给出这个错误。想不出办法解决这个问题。
    • 尝试创建卷目录,并挂载到/var/run/
    • 我也试过了。守护程序启动时出现此错误:“错误启动守护程序:初始化网络控制器时出错:获取控制器实例时出错:监听 unix /run/docker/libnetwork/1270301870eb6a20cfef4a5fb13b9e8dcea6298f188876a58de80bcc85a3bf36.sock:bind:permission denied”
    • 我明白了,它必须是卷目录权限。给它 0777。或者确保它归用于运行 docker 的用户所有,如果它不是 root 的话。您可以在不使用 k8s 的情况下对其进行测试,方法是创建一个挂载目录的容器 - 这就是 kubelet 的作用
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-24
    • 2020-01-30
    • 1970-01-01
    相关资源
    最近更新 更多