繁体   English   中英

在Docker中使用Docker时如何共享主机网桥

[英]How to share host network bridge when using docker in docker

我正在使用https://github.com/jpetazzo/dind Docker映像在Docker中放置Docker。 在父docker内部启动docker容器时,是否可以使用父docker的网桥,以便我可以在docker容器内部的容器和父docker容器之间共享网络?

我想要做的是直接通过IP从主机访问父docker容器内的容器,从而为它们分配域名。

更新->主要思想

我正在升级免费的在线Java编译器,以允许用户使用docker运行任何程序。 所以我正在使用dind(docker镜像中的docker)启动一个主容器,该容器在Java程序内部具有接收请求的程序,并在其中启动docker容器。 因此,我要做的是为用户提供运行公开端口的程序的选项,并允许他们使用子域访问其容器。 所以在图形上我有这个层次

Internet -> My Host -> Main Docker Container -> User Docker Container 1
                                             -> User Docker Container 2
                                             -> User Docker Container n

我想给用户一个子域名来访问他的“用户Docker容器”,例如:www.user_25.compiler1.browxy.com

因此,他可以使用一个程序在他的“用户Docker容器”中公开一个端口,并可以使用子域www.user_25.compiler1.browxy.com访问该端口

令我困惑的是,要访问“用户Docker容器”,我需要先访问主Docker容器。 我试图找到一种直接访问“用户Docker容器”的方法,所以我认为,如果用户Docker容器和主Docker容器可以共享同一网络,那么我可以直接从主机访问用户Docker容器并分配“用户Docker容器” IP的域名,以更新主机上的/ etc / hosts文件。

非常感谢您的任何意见或建议:)

如果使用--net=host运行“主--net=host容器”,那么您的配置将简化为:

Internet -> Host -> User Docker Container 1
                 -> User Docker Container 2
                 -> User Docker Container n

尽管您可能想为子容器使用docker0以外的docker0器(例如,创建一个新的桥接器docker1 ,然后使用-b docker1启动您的dind Docker守护进程)。

如果两个用户试图在同一IP地址的同一端口上发布服务,则可以,则将发生端口冲突。 有几种解决方法:

  1. 如果您可以在主机上支持多个公共ip地址,则可以为每个容器“分配”一个(用引号引起来,因为这不是自动的)。 而不是运行docker run -p 80:80 ... ,您需要使bind ip显式化,例如docker run -p 80:80:1.2.3.4 这就要求人们“玩得开心”。 也就是说,没有什么可以防止某人忘记指定绑定地址或指定错误的地址。

  2. 如果您明确运行Web服务,则可以使用某种前端代理使用基于名称的虚拟主机将子域名映射到容器。 此过程有多个组件,因此使其自动化可能需要一点工作。 手动执行比较容易(例如,只需更新/etc/hosts ),但是比较脆弱,因为重新启动容器时,它将具有一个新的IP地址。 诸如动态DNS服务之类的功能可以帮助解决此问题。

这些主要是建议而非解决方案,但如果您需要更多详细信息,请告诉我。 可能还有其他方法可以使这种特殊的螺母破裂,因此希望其他人会发出声音。

最终,我接受了Larsks给我的很多想法,这就是我所做的

  1. 使用名称(--name编译器)在docker容器中启动docker
  2. 在主机中执行此命令-> sudo route add -net 10.0.0.0 gw docker inspect --format '{{ .NetworkSettings.IPAddress }}' compiler网络掩码255.255.255.0

为此,我在docker容器的docker中添加了一个自定义桥,以确保ip范围为10.0.0.0/24

现在我可以从主机ping在docker容器中的docker内部创建的容器

为了进行名称解析,我按照建议将larsk安装到docker容器中的docker中来安装docker-dns,并将其IP添加到主机中的/etc/resolv.conf中

结果是,可以从主机访问按名称在Docker容器中的Docker内部创建的容器。

我可能想要升级的一件事情是使用docker配置所有东西,并且不向主机中添加自定义内容,但是到目前为止,我不知道该怎么做,我可以使用此解决方案

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM