Networking Docker容器与Docker中的Docker联网

Networking Docker容器与Docker中的Docker联网,networking,docker,docker-in-docker,Networking,Docker,Docker In Docker,我想与父docker容器中的子docker容器建立网络,并在docker设置中与docker建立网络 假设我正在尝试连接到一个简单的apachehttpd服务器。在主机上运行httpd容器时,一切正常: asnyder:~$ docker run -d -p 8080:80 httpd:alpine asnyder:~$ curl localhost:8080 <html><body><h1>It works!</h1></body>&

我想与父docker容器中的子docker容器建立网络,并在docker设置中与docker建立网络

假设我正在尝试连接到一个简单的apachehttpd服务器。在主机上运行httpd容器时,一切正常:

asnyder:~$ docker run -d -p 8080:80 httpd:alpine
asnyder:~$ curl localhost:8080
<html><body><h1>It works!</h1></body></html>
我试过几次,但运气不好。指定
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
令人惊讶的是,我找不到任何关于这方面的现有文章。这里有人有什么见解吗


谢谢

安装Docker插座的DinD和bind都有优点和缺点,当然两者都有使用案例。作为一个例子,请查看,它很好地解释了一个用例

根据上面docker设置中的docker示例,您可以通过以下两种方式之一访问Apache httpd服务器:

1) 从
docker:dind
容器内部,它将在
localhost:8080
上可用

2) 从最初尝试访问它的
docker:latest
容器内部,它将在为
docker:dind
容器设置的任何主机名上可用。在本例中,您使用了
--name mydind
,因此
curl mydind:8080
将为您提供标准的Apache
,它可以工作

希望它有意义

建立在:

2) 从
docker:dind
容器内部,[…]它将在为
docker:dind
容器设置的任何主机名上可用。在本例中,您使用了
--name mydind
,因此
curl mydind:8080
[…]

在Gitlab CI配置中,您可以(除了自动生成的容器名称之外):

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

然后,您可以使用
.gitlab ci.yml
中的图像:

services:
- tutum/wordpress:latest
如果没有,则当作业运行时,
tutuum/wordpress
将启动,您将可以从构建容器中的两个主机名下访问该作业:

  • tutum-wordpress
  • tutum\uuuuWordPress
使用

将允许您以docker:8080的身份访问该容器:

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

编辑:如果您想要更明确的主机名,可以使用
别名

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

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

我非常相信@Yuriy Znatokov的答案是我想要的,但我已经理解了很久了。为了让以后的人更容易理解,我导出了完整的步骤

1) 从码头工人内部:dind集装箱

docker-run-d——名称mydind——特权docker:dind
/#docker run-d-p 8080:80 httpd:alpine
/#curl localhost:8080
它起作用了!
2) 从docker内部:最新的容器

docker-run-d——名称mydind——特权docker:dind
docker run-it--link mydind:docker docker:latest sh
/#docker run-d-p 8080:80 httpd:alpine
/#curl mydind:8080
它起作用了!

首先让我问一下,您是否确定在docker设置中需要docker?先看博客文章。@JonesV我避免进入问题中的特定场景,以保持其概括性,但既然你问了。。。我正在写一封信。GitLab CI中的作业在您可以指定的docker容器中运行。我正在写一份基于HTML的PDF报告,我想利用现有的Docker图像来完成这项工作。所以,我有一个码头工人在码头工人的情况。我希望这有助于澄清:)恐怕我无法在docker设置中帮助docker。我只是想确保您知道博文=)中提到的要点。我自己也有同样的问题——GitLab CI使用带有
docker:dind
服务的
docker
图像,我也可以从自己的主机连接,但不能在
docker
容器中。非常清楚,提出了一个很好的问题!你们两个都很棒!谢谢!是什么导致无法从主机容器访问子容器,例如localhost:8080连接失败、连接被拒绝(
curl
)?这很好地描述了我在尝试从主机容器访问暴露端口上的子容器时遇到的问题:我仍在努力解决这个问题。父级和dind contaner之间是否需要链接或网络?如果在GitlabCI中我使用以下脚本:
docker compose-f docker-compose.yml up
,如果我有一个名为
mongodb
的服务,会发生什么?我似乎不能使用
mongodb
作为主机名。
services:
- name: docker:dind
  alias: dind-service
  script:
  - docker run -d -p 8080:80 httpd:alpine
  - curl dind-service:8080