如何将 Docker 网络暴露给主机?
Posted
技术标签:
【中文标题】如何将 Docker 网络暴露给主机?【英文标题】:How to expose a Docker network to the host machine? 【发布时间】:2016-12-28 11:23:18 【问题描述】:考虑以下docker-compose.yml
version: '2'
services:
serv1:
build: .
ports:
- "8080:8080"
links:
- serv2
serv2:
image: redis
ports:
- "6379:6379"
我将端口转发到主机以管理我的服务,但服务可以简单地使用默认的 docker 网络相互访问。例如,在serv1
上运行的程序可以访问redis:6379
,并且一些DNS 魔法将使其工作。我想将我的主机添加到这个网络,以便我可以通过它们的主机名访问容器的端口:端口。
【问题讨论】:
npmjs.com/package/docker-machine-dns 目前Docker会告诉你继续使用端口绑定。没有任何东西可以暴露内部 DNS 或链接到我见过的 docker 主机。默认的防火墙规则会阻止您从主机外部直接访问并强制您通过此端口绑定。 Nehal 的评论显示解析 docker 主机,artworkad 显示您已经完成的端口绑定。 【参考方案1】:我不确定我是否理解正确。你想要例如您的 redis 服务器不仅可以从同一网络中的容器访问,还可以从容器外部使用您的主机 IP 地址访问?
要完成此操作,您必须使用此处所述的 expose 命令https://docs.docker.com/compose/compose-file/#/expose
expose:
- "6379"
所以
ports:
- "6379:6379"
expose:
- "6379"
应该可以解决问题。
EXPOSE 指令通知 Docker 容器正在监听 运行时指定的网络端口。 EXPOSE 不使端口 主机可访问的容器。为此,您必须使用 -p 标志发布一系列端口或 -P 标志 发布所有暴露的端口。您可以公开一个端口号并 以其他号码对外发布。
来自https://docs.docker.com/engine/reference/builder/#expose
【讨论】:
不完全是,我希望能够访问容器中我喜欢的任何端口,而无需绑定到主机的端口。例如,如果在 serv1 上的 8080 上运行 Web 服务器,我想在主机的浏览器上指向 serv1:8080 而不是 localhost:8080。这样我就不需要每次需要访问新端口时都编辑 docker-compose 文件 请注意,这已经发生在容器之间。在我的 serv1 容器中,我可以通过 serv2:6379 访问 redis 守护进程。无需预先暴露端口或任何东西,它们在同一个网络上,它就可以工作。我希望主机上有这种行为。 @polvoazul 我明白了。但我认为您不能将通过 DNS 的内部服务发现与向主机公开服务(通过端口绑定完成)混合在一起。我也怀疑只公开所有端口是一种好习惯。因此,要从主机访问服务,我认为围绕端口绑定并不是一个很好的方法(至少我不知道这种方法)。 来自 docker.com: [expose] - "公开端口而不将它们发布到主机..."【参考方案2】:您可以通过在与应用程序位于同一网络的容器中运行 dns 代理(如 dnsmasq)来完成此操作。然后将您的主机 dns 指向容器 ip,您将能够解析主机名,就像您在网络上的容器中一样。
https://github.com/hiroshi/docker-dns-proxy 就是其中的一个例子。
【讨论】:
【参考方案3】:只需修改主机上的 hosts 文件即可添加容器条目。 示例: 127.0.0.1 容器1 127.0.0.1 容器2 127.0.0.1 容器3
假设端口的绑定已经完成。
【讨论】:
【参考方案4】:如果您需要快速解决方法来访问容器:
-
Get the container IP:
$ docker inspect -f 'range .NetworkSettings.Networks.IPAddressend' container_name_or_id
172.19.0.9
-
如果您需要使用容器名称,请将其添加到您的
/etc/hosts
。
# /etc/hosts
172.19.0.9 container_name
【讨论】:
以上是关于如何将 Docker 网络暴露给主机?的主要内容,如果未能解决你的问题,请参考以下文章
如何在没有端口映射的情况下将 docker 容器的 ip 和端口暴露给外部 docker 主机?