如何从容器中调用主机的docker守护程序?

时间:2018-01-08 14:53:59

标签: docker docker-swarm docker-container

这正是我需要的。我已经有一个项目正在启动一组特定的泊坞窗图像,它完全正常。

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

有没有办法做到这一点?

2 个答案:

答案 0 :(得分:5)

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

例如,如果我启动一个新的fedora容器,在我的主机上公开docker socket:

$ 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
...

答案 1 :(得分:2)

您可以让容器通过docker socket访问主机的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 images,以检查它是否有效。

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

上安装它
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"

希望有所帮助