2017-06-29 77 views
2

我想通过docker-in-docker设置与父Docker集装箱中的一个小孩码头集装箱联网。Docker集装箱网络与Docker-in-Docker

假设我试图连接到一个简单的Apache httpd服务器。当我在我的主机上运行的httpd容器,一切工作正常:

asnyder:~$ docker run -d -p 8080:80 httpd:alpine 
asnyder:~$ curl localhost:8080 
<html><body><h1>It works!</h1></body></html> 

但是,当我做同样的从泊坞窗功能于泊坞窗的设置,我得到一个Connection refused错误:

asnyder:~$ docker run -d --name mydind --privileged docker:dind 
asnyder:~$ docker run -it --link mydind:docker docker:latest sh 
/# docker run -d -p 8080:80 httpd:alpine 
/# curl localhost:8080 
curl: (7) Failed to connect to localhost port 8080: Connection refused 

我尝试了几次改变,但没有运气。指定0.0.0.0接口:

asnyder:~$ docker run -d --name mydind --privileged docker:dind 
asnyder:~$ docker run -it --link mydind:docker docker:latest sh 
/# docker run -d -p 0.0.0.0:8080:80 httpd:alpine 
/# curl 0.0.0.0:8080 
curl: (7) Failed to connect to 0.0.0.0 port 8080: Connection refused 

使用主机网络:

asnyder:~$ docker run -d --name mydind --privileged docker:dind 
asnyder:~$ docker run -it --link mydind:docker docker:latest sh 
/# docker run -d --network host httpd:alpine 
/# curl localhost:80 
curl: (7) Failed to connect to localhost port 80: Connection refused 

出人意料的是,我无法找到这个任何现有的文章。有人在这里有一些见解吗?

谢谢!

+0

让我先问你,如果你确定你想要码头泊位设置?先阅读[this](http://jpetazzo.github.io/2015/09/03/do-not-use-docker-in-docker-for-ci/)博文。 – JonesV

+0

@JonesV我避免进入问题的具体情况,以保持它的一般性,但因为你问... 我正在写一个[GitLab CI管道作业](https://docs.gitlab.com/ee/CI/YAML /)。 GitLab CI中的作业在您可以指定的Docker容器内运行。我正在编写一个基于某些HTML生成PDF报告的作业,并且我想利用现有的Docker映像来执行此操作。所以,我有一个码头泊位的情况。 我希望这有助于澄清:) –

+0

恐怕我无法帮助码头泊位设置。我只是想确保你知道博客文章中提到的要点=)。 – JonesV

回答

1

DinD和绑定Docker套接字都有优点和缺点,并且两者都有一定的用例。作为一个例子,请查看this set of blog posts,它很好地解释了其中的一个用例。

鉴于您的例子泊坞窗功能于泊坞窗上面设置,您可以通过以下两种方式之一访问的Apache httpd服务:

1)从docker:dind容器内,这将可在localhost:8080

2)从docker:latest容器中,您最初尝试访问它的容器中,它将可用于为docker:dind容器设置的任何主机名。在这种情况下,您使用了--name mydind,因此curl mydind:8080会为您提供标准的Apache <html><body><h1>It works!</h1></body></html>

希望它是有道理的!