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

时间:2016-08-22 02:13:16

标签: networking docker docker-compose

考虑以下docker-compose.yml

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

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

我正在向主机发送端口以管理我的服务,但服务可以使用默认的docker网络相互访问。例如,在serv1上运行的程序可以访问redis:6379,而某些DNS魔法可以使其正常工作。我想将我的主机添加到此网络,以便我可以通过其主机名:端口访问容器的端口。

4 个答案:

答案 0 :(得分:5)

您可以通过在与应用程序位于同一网络的容器中运行dns代理(如dnsmasq)来实现此目的。然后将主机dns指向容器ip,您将能够解析主机名,就像您在网络容器中一样。

https://github.com/hiroshi/docker-dns-proxy就是一个例子。

答案 1 :(得分:2)

我不确定我是否理解正确。你想要,例如您的redis服务器不仅可以从同一网络中的容器访问,还可以使用主机IP地址从容器外部访问?

要实现这一点,您必须使用公开命令,如此处所述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

答案 2 :(得分:0)

只需修改主机上的hosts文件即可添加容器条目。 示例: 127.0.0.1容器1 127.0.0.1容器2 127.0.0.1 container3

假定端口的绑定已完成。

答案 3 :(得分:0)

如果您需要快速解决方法来访问容器:

  1. Get the container 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