Docker 容器网络与 Docker-in-Docker

     2023-04-15     117

关键词:

【中文标题】Docker 容器网络与 Docker-in-Docker【英文标题】:Docker Container Networking with Docker-in-Docker 【发布时间】:2017-12-03 11:33:09 【问题描述】:

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

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

谢谢!

【问题讨论】:

我先问你是否确定要使用 docker-in-docker 设置?请先阅读this 博文。 @JonesV 我避免进入问题中的特定场景以保持一般性,但既然你问了......我正在写GitLab CI Pipeline Job。 GitLab CI 中的作业在您可以指定的 docker 容器中运行。我正在编写一个基于某些 HTML 生成 PDF 报告的作业,并且我想利用现有的 Docker 映像来执行此操作。所以,我有一个码头工人的情况。我希望这有助于澄清:) 恐怕我无法帮助进行 docker-in-docker 设置。我只是想确保您了解博文中提到的要点 =)。 我自己也遇到了同样的问题——GitLab CI 使用docker 图像和docker:dind 服务,我也可以从我自己的主机连接,但不能在docker 容器内连接。非常清晰和恰当的问题! 【参考方案1】:

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 &lt;html&gt;&lt;body&gt;&lt;h1&gt;It works!&lt;/h1&gt;&lt;/body&gt;&lt;/html&gt;

希望这是有道理的!

【讨论】:

你们俩都很棒!谢谢! 什么会导致子容器无法从主机容器访问,例如localhost:8080 连接失败,连接被拒绝(curl)? 这很好地描述了我在尝试从主机容器的暴露端口访问子容器时看到的问题:edureka.co/community/12457/… 我还在为此苦苦挣扎。父容器和dind容器之间是否需要链接或网络?【参考方案2】:

以Yuriy's answer为基础:

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

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

访问服务


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

然后,您可以在 .gitlab-ci.yml 中使用 tutum/wordpress 图像:

services:
- tutum/wordpress:latest

如果你不specify a service alias,当作业运行时,tutum/wordpress 将被启动,你将可以在两个主机名下从你的构建容器中访问它:

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

【讨论】:

如果我在 GitlabCI 中使用这个脚本:docker-compose -f docker-compose.yml up 并且如果我有一个名为 mongodb 的服务会发生什么?我好像不能用mongodb 作为主机名。【参考方案3】:

我非常确信@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基本命令与使用——docker容器的网络连接

一.Docker容器的网络基础通过ifconfig查看docker0的网络设备,docker守护进程就是通过docker0为docker的容器提供网络连接的各种服务。docker0是Linux虚拟网桥。Linux虚拟网桥的特点:可以设置IP地址相当于拥有一个隐藏的虚拟网卡docker0的地... 查看详情

docker存储与网络(代码片段)

目录Docker存储挂载主机目录创建一个数据卷挂载一个宿主机目录作为数据卷数据卷容器创建一个数据卷容器利用数据卷容器迁移数据删除数据盘Docker网络简介bridge网络bridge网络基本用法基于bridge网络的容器访问外部网络外部网络... 查看详情

docker网络与容器互联(代码片段)

@[TOC]#Docker网络与容器互联资源推荐Docker官网配置网络:https://docs.docker.com/network/Docker网络详解:https://blog.csdn.net/meltsnow/article/details/94490994Docker四种网络模式:https://www.jianshu.com/p/22a7032bb7bd使用网络网络驱动名称官方文档官方教程br... 查看详情

docker网络与容器互联(代码片段)

@[TOC]#Docker网络与容器互联资源推荐Docker官网配置网络:https://docs.docker.com/network/Docker网络详解:https://blog.csdn.net/meltsnow/article/details/94490994Docker四种网络模式:https://www.jianshu.com/p/22a7032bb7bd使用网络网络驱动名称官方文档官方教程br... 查看详情

docker学习docker容器网络通信原理分析(代码片段)

   概述自从docker容器出现以来,容器的网络通信就一直是大家关注的焦点,也是生产环境的迫切需求。而容器的网络通信又可以分为两大方面:单主机容器上的相互通信,和跨主机的容器相互通信。而本文将分别针对... 查看详情

企业——docker容器的网络管理

 一.Docker容器的四种网络模式容器的本质是一个被隔离的进程,而这个进程又有其独立的网络栈,即网卡(NetworkInterface)、回环设备(LoopbackDevice)、路由表(RoutingTable)和iptables规则。单机时代的容器网络实际上有三种通信... 查看详情

docker入门与应用系列网络管理

Docker支持五种网络模式 bridge默认网络,docker启动后创建一个dockr0网桥,默认创建的容器也是添加到这个网桥中;IP地址段是172.17.0.1/16 host容器不会获得一个独立的networknamespace,而是与宿主机共用一个 none获取独立的networknamespace... 查看详情

1.7docker-网络管理(代码片段)

...器与容器之间,容器与外网通信的桥梁。当运行容器时,Docker会在物理机上创建Docker0和vethx虚拟网卡,Docker0是一个三层接口拥有容器网段的IP地址,用于物理机与容器通信,而vethx是一个二层虚拟接口,用于连接容器网卡。默认... 查看详情

docker容器网络

参考技术A利用NetNamespace可以为Docker容器创建隔离的网络环境,容器具有完全独立的网络栈,与宿主机隔离。也可以使Docker容器共享主机或者其他容器的网络命名空间,基本可以满足开发者在各种场景下的需要。Docker支持4种网络... 查看详情

docker网络(代码片段)

docker的几种原生网络模式host:该模式下,容器将不会虚拟出自己的网卡,配置自己的IP等,而是共享Dockerhost的网络栈,容器的网络配置与Dockerhost完全一样None:该模式关闭了容器的网络功能,除了lo,没有其他任何网卡。Bridge:... 查看详情

docker数据管理与网络通信(代码片段)

Docker(六)数据管理在Docker中,为了方便查看容器内产生的数据或者将多个容器中的数据实现共享,就涉及到容器的数据管理操作管理Docker容器中数据主要有两种方法:数据卷<DataVolumes>数据卷容器<DataVolumesContainer>数据... 查看详情

docker入门与应用系列网络管理

一、Docker的五种网络模式  在使用dockerrun创建docker容器时,可以用--net选项指定容器的网络模式,Docker有以下5种网络模式:   1.bridge模式   使用dockerrun--net=bridge指定,bridge模式是Docker默认的网络设置,此模式会为... 查看详情

21.docker技术入门与实战---libnetwork插件化网络功能

...模型包括三种基本要素: 1.沙盒 2.接入点 3.网络21.2 Docker网络命令21.3 构建跨主机容器网络      查看详情

21.docker技术入门与实战---libnetwork插件化网络功能

...模型包括三种基本要素: 1.沙盒 2.接入点 3.网络21.2 Docker网络命令21.3 构建跨主机容器网络      查看详情

docker+openvswitch实现主机与容器的网络通信

...:安装openvswitchovs创建br0,br1,并启动两个不加载网络的docker容器将容器关联网桥br0,并设置ip、vlan创建veth0与veth1网卡对创建netns名称空间,并添加veth0.0和veth1.0接口,并配置相关信息将veth0.1 查看详情

docker网络类型访问原理(代码片段)

•bridge–net=bridge默认网络,Docker启动后创建一个docker0网桥,默认创建的容器也是添加到这个网桥中。•host–net=host容器不会获得一个独立的networknamespace,而是与宿主机共用一个。这就意味着容器不会有自己的网卡信... 查看详情

docker-网络

...与外部通信3桥接把物理网卡与桥做关联,物理网卡当桥docker网络有四种 默认为nat,自动安装创建的1封闭式容器2桥接式容器3联盟式容器,让两个容器之间共享一个ip4开放式容器#docker network&nbs 查看详情

docker网络详解与实战(代码片段)

文章目录1.Docker默认的网络模式1.1host模式1.2container模式1.3none模式1.4bridge模式2.容器互联3.自定义网络4.Docker网络之间的互联5.Docker网络实战练习5.1Redis集群部署5.2SpringBoot项目打包镜像1.Docker默认的网络模式使用以下命令查看所有的D... 查看详情