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>
我想通过 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 thedocker:dind
container. In this case, you used--name mydind
, thereforecurl 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>