Docker 容器网络 Docker-in-Docker

Docker Container Networking with Docker-in-Docker

我想通过 docker-in-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>

但是当我从 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

我试过几次改动,但都没有成功。指定 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

令人惊讶的是,我找不到任何关于此的现有文章。这里有没有人有一些见解?

谢谢!

DinD 和绑定安装 Docker 套接字各有利弊,两者都有用例。例如,查看 this set of blog posts,它很好地解释了其中一个用例。

根据上面的 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>.

希望它有意义!

建立在之上:

2) From inside the docker:latest container, [...] it will be available on whatever hostname is set for the docker:dind container. In this case, you used --name mydind, therefore curl mydind:8080 [...]

在Gitlab CI配置中,你可以address the DinD container by the name of its image(除了自动生成的容器名称):

Accessing the services


Let’s say that you need a Wordpress instance to test some API integration with your application.

You can then use for example the tutum/wordpress image in your .gitlab-ci.yml:

services:
- tutum/wordpress:latest

If you don’t specify a service alias, when the job is run, tutum/wordpress will be started and you will have access to it from your build container under two hostnames to choose from:

  • tutum-wordpress
  • tutum__wordpress

使用

service:
- docker:dind

将允许您以 docker:8080:

的形式访问该容器
  script:
  - docker run -d -p 8080:80 httpd:alpine
  - curl docker:8080

编辑:如果您更喜欢更明确的主机名,您可以as the documentation states使用alias:

services:
- name: docker:dind
  alias: dind-service

然后

  script:
  - docker run -d -p 8080:80 httpd:alpine
  - curl dind-service:8080

嗯, dtk

我非常确信@Yuriy Znatokov 的回答是我想要的,但我已经理解了很长时间。为了方便后面的人更容易理解,我把完整的步骤导出来了。

1) 从 docker:dind 容器内部

docker run -d --name mydind --privileged docker:dind
/ # docker run -d -p 8080:80 httpd:alpine
/ # curl localhost:8080
<html><body><h1>It works!</h1></body></html>

2) 从 docker:latest 容器内部

docker run -d --name mydind --privileged docker:dind
docker run -it --link mydind:docker docker:latest sh
/ # docker run -d -p 8080:80 httpd:alpine
/ # curl mydind:8080
<html><body><h1>It works!</h1></body></html>