如何将Docker网络暴露给主机?

26

请看下面的docker-compose.yml文件:

version: '2'
services:
    serv1:
        build: .
        ports:
          - "8080:8080"
    links:
      - serv2

    serv2:
        image: redis
        ports:
          - "6379:6379"

我正在将端口转发到主机上以便管理我的服务,但是服务可以使用默认的Docker网络轻松地相互访问。例如,在serv1上运行的程序可以访问redis:6379,一些DNS魔法会使其起作用。我想将我的主机添加到这个网络中,以便通过它们的主机名:端口访问容器的端口。


https://www.npmjs.com/package/docker-machine-dns - Nehal J Wani
2
目前,Docker 会告诉你继续使用端口绑定。我没有看到任何暴露内部 DNS 或链接到 Docker 主机的方法。默认的防火墙规则会阻止你直接从主机外部访问,并强制你通过此端口绑定进行访问。Nehal 的评论显示了解决 Docker 主机的方法,而 artworkad 显示了你已经在做的端口绑定。 - BMitch
4个回答

11
你可以通过在与应用程序相同的网络上运行dns代理(例如dnsmasq)的容器来实现此目的。然后将主机的dns指向容器ip,您就可以像在网络中的容器中一样解析主机名。 https://github.com/hiroshi/docker-dns-proxy 是其中一个例子。

5

如果您需要快速解决访问容器的问题:

  1. 获取容器IP地址
$ docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container_name_or_id

172.19.0.9
  1. 如果需要使用容器名称,请将其添加到您的/etc/hosts文件中。
# /etc/hosts

172.19.0.9 container_name

这假设docker暴露了桥接网络,但我认为情况并非如此。 - piotrga

4
我不确定我是否正确理解了您的意思。您想让您的Redis服务器不仅可以从同一网络中的容器访问,还可以使用主机IP地址从容器外部访问吗?
要实现这一点,您需要使用“expose”命令,如此处所述https://docs.docker.com/compose/compose-file/#/expose
expose:
  - "6379"

所以
ports:
  - "6379:6379"
expose:
  - "6379"

“should do the trick.”的中文含义是“应该可以搞定。”这篇文章中的主要内容是关于Docker中EXPOSE命令的说明以及如何使容器中的端口对外可访问的方法。该命令只是告诉Docker在运行时容器监听哪些网络端口,并不会将容器中的端口暴露给宿主机。若想实现该功能,需使用-p标志来发布一系列端口或使用-P标志来发布所有已公开的端口,同时还可以将一个端口号展示为另一个外部端口号。更多细节请参考https://docs.docker.com/engine/reference/builder/#expose

2
不完全是这样,我想能够访问容器中任何我喜欢的端口,而不绑定到主机的端口。例如,如果在serv1上运行着一个监听8080端口的Web服务器,我希望能够在本地浏览器中输入serv1:8080而不是localhost:8080。这样一来,我就不需要每次需要访问一个新的端口时都编辑docker-compose文件了。 - polvoazul
请注意,这已经在容器之间发生了。在我的serv1容器中,我可以通过serv2:6379访问redis守护程序。无需提前暴露端口或任何其他操作,它们在同一网络上,它只是有效的。 我希望在主机上也能实现这种行为。 - polvoazul
@polvoazul 我明白。但我认为您不能将DNS上的内部服务发现与向主机公开服务混合在一起(这是通过端口绑定完成的)。此外,我怀疑仅公开所有端口是否是一个好的做法。因此,要从主机访问服务,我认为没有真正避免端口绑定的好方法(至少我不知道有这样的方法)。 - DarkLeafyGreen
来自docker.com:[expose] - “暴露端口,而不将它们发布到主机机器…” - Jaroslav Záruba

-1

只需修改主机上的hosts文件以添加容器条目。 示例: 127.0.0.1 container1 127.0.0.1 container2 127.0.0.1 container3

假设端口绑定已完成。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接