【问题标题】:How can I call docker daemon of the host-machine from a container?如何从容器中调用主机的 docker 守护进程?
【发布时间】:2018-01-08 23:42:31
【问题描述】:

这正是我需要的。我已经有一个项目正在启动一组特定的 docker 图像,它工作得很好。

但我想创建另一个图像,特别是从头开始构建这个项目,其中包含所有依赖项。所以,问题是,在构建时,要创建 docker 镜像,我们需要从构建容器访问在主机上运行的 docker daemon。

有什么办法吗?

【问题讨论】:

    标签: docker docker-swarm docker-container


    【解决方案1】:

    如果您需要从容器内部访问主机上的 docker,您可以使用主机挂载(docker run 命令行上的-v /host/path:/container/path)简单地公开容器内的 Docker 套接字。

    例如,如果我启动一个新的fedora 容器,暴露主机上的 docker 套接字:

    $ docker run -it -v /var/run/docker.sock:/var/run/docker.sock fedora bash
    

    然后在容器内安装docker

    [root@d28650013548 /]# yum -y install docker
    ...many lines elided...
    

    我现在可以与主机上的 docker 对话了:

    [root@d28650013548 /]# docker info
    Containers: 6
     Running: 1
     Paused: 0
     Stopped: 5
    Images: 530
    Server Version: 17.05.0-ce
    ...
    

    【讨论】:

    • 这是更好的答案。您应该在容器中安装 docker,因为 docker 安装确实会在 unix 风格之间发生变化(请参阅 red hat 维护的 docker 与官方 ubuntu 安装)。就像我在另一个答案中提到的那样,将这些绑定挂载设置为只读是有益的。
    • 谢谢大家
    • @larsks 我有一个问题,yum -y install docker 命令不起作用,因为 ubuntu docker 映像中没有显示 yum,apt-get 或 dpkg 也不可用。不确定在这种情况下如何在容器内安装 docker :(
    • 一个 ubuntu 镜像通常有 apt-get 可用。所有官方的都可以。
    【解决方案2】:

    您可以让容器通过 docker 套接字访问主机的 docker 守护程序,并“欺骗”它以在容器内拥有 docker 可执行文件,而无需在其中安装 docker。就这样(以 Ubuntu-Xenial 容器为例):

    docker run --name dockerInsideContainer -ti -v /var/run/docker.sock:/var/run/docker.sock -v $(which docker):/usr/bin/docker ubuntu:xenial
    

    在其中,您可以启动任何 docker 命令,例如 docker images 以检查它是否正常工作。

    如果您看到这样的错误:docker: error while loading shared libraries: libltdl.so.7: cannot open shared object file: No such file or directory,您应该在容器内安装一个名为 libltdl7 的包。因此,例如,您可以为容器创建一个 Dockerfile 或直接在运行时安装它:

    FROM ubuntu:xenial
    apt update
    apt install -y libltdl7
    

    docker run --name dockerInsideContainer -ti -v /var/run/docker.sock:/var/run/docker.sock -v $(which docker):/usr/bin/docker ubuntu:xenial bash -c "apt update && apt install libltdl7 && bash"
    

    希望对你有帮助

    【讨论】:

    • Docker 套接字将其安装为只读没有效果。无论如何,它提供了对 docker daemon 的完全访问权限。
    • 将其挂载为 ro 并不是限制对 docker daemon 的访问,而是限制对主机文件的访问。这可以防止 rm'ing 套接字或在您的情况下是 docker bin 文件的能力。
    • 我经常参考那篇文章。那篇文章所说的是,即使使用 ro,它也不会阻止该容器内的用户启动新容器并安装其他主机卷并删除它们。一般来说,这是安装 docker 插座的固有风险。我要说的一点是:如果您需要在 Docker 容器中挂载某些东西并且它不需要写访问权限,那么它应该是 ro。如果不只是从文件安全的角度来看的话。
    • 如果您的问题得到解决,请将您喜欢的答案标记为解决方案和/或对您认为有趣和对您有帮助的所有内容进行投票。
    猜你喜欢
    • 1970-01-01
    • 2018-04-05
    • 2018-11-08
    • 1970-01-01
    • 1970-01-01
    • 2021-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多