与Docker-in-Docker的Docker容器网络

Ada*_*der 14 networking docker docker-in-docker

我想使用docker-docker设置与父Docker容器中的子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>
Run Code Online (Sandbox Code Playgroud)

但是当我从Docker-in-docker设置中执行相同操作时,我收到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
Run Code Online (Sandbox Code Playgroud)

我没有运气就尝试过几次改装.指定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
Run Code Online (Sandbox Code Playgroud)

使用主机网络:

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
Run Code Online (Sandbox Code Playgroud)

令人惊讶的是,我无法在此找到任何现有文章.这里有人有一些见解吗?

谢谢!

dtk*_*dtk 11

基于尤里的回答

2)从内部docker:latest container,[...] 它将在为docker:dind容器设置的任何主机名上可用。在这种情况下,您使用了--name mydind,因此curl mydind:8080[...]

在 Gitlab CI 配置中,您可以通过 DinD 容器的映像名称(除了自动生成的容器名称之外)来寻址 DinD 容器

访问服务


假设您需要一个 Wordpress 实例来测试一些 API 与您的应用程序的集成。

然后,您可以在您的以下文件中使用例如tutum/wordpress图像.gitlab-ci.yml

services:
- tutum/wordpress:latest
Run Code Online (Sandbox Code Playgroud)

如果您未指定服务别名,则在作业运行时tutum/wordpress将启动,您将可以从构建容器中访问它,并在两个主机名下进行选择:

  • tutum-wordpress
  • tutum__wordpress

使用

service:
- docker:dind
Run Code Online (Sandbox Code Playgroud)

将允许您访问该容器docker:8080

  script:
  - docker run -d -p 8080:80 httpd:alpine
  - curl docker:8080
Run Code Online (Sandbox Code Playgroud)

编辑:如果您更喜欢更明确的主机名,则可以如文档所述,使用alias

services:
- name: docker:dind
  alias: dind-service
Run Code Online (Sandbox Code Playgroud)

进而

  script:
  - docker run -d -p 8080:80 httpd:alpine
  - curl dind-service:8080
Run Code Online (Sandbox Code Playgroud)

hth, dtk

  • 如果在 GitlabCI 中我使用这个脚本:“docker-compose -f docker-compose.yml up”并且我有一个名为“mongodb”的服务,会发生什么?我似乎无法使用“mongodb”作为主机名。 (2认同)

小智 9

DinD和bind安装Docker插槽都有利有弊,两者肯定都有用例.例如,查看这组博客文章,它可以很好地解释其中一个用例.

鉴于上面的docker-in-docker设置示例,您可以通过以下两种方式之一访问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>.

希望它有意义!