Networking 如何向主机公开Docker网络?

Networking 如何向主机公开Docker网络?,networking,docker,docker-compose,Networking,Docker,Docker Compose,考虑以下docker compose.yml version: '2' services: serv1: build: . ports: - "8080:8080" links: - serv2 serv2: image: redis ports: - "6379:6379" 为了管理我的服务,我将端口转发给主机,但是这些服务可以使用默认的docker网

考虑以下
docker compose.yml

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

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

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

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

要实现这一点,您必须使用此处描述的expose命令

所以

我们应该做到这一点

EXPOSE指令通知Docker容器正在侦听 运行时指定的网络端口。EXPOSE不会使端口失效 主机可以访问的容器的名称。要做到这一点,您必须使用 可以使用-p标志发布一系列端口,也可以使用-p标志发布一系列端口 发布所有公开的端口。您可以公开一个端口号和 以其他编号对外发布


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


就是一个例子。

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


假设端口绑定已完成。如果需要快速解决方法来访问容器:

  • :
  • 如果需要使用容器名称,请将其添加到
    /etc/hosts

  • 目前,Docker会告诉您继续使用端口绑定。没有什么可以公开内部DNS或链接到docker主机的,我已经看到了。默认防火墙规则将阻止您从主机外部直接访问,并强制您通过此端口绑定。Nehal的评论显示解析docker主机,artworkad显示您已经进行的端口绑定。不完全是这样,我希望能够访问容器中我喜欢的任何端口,而不绑定到主机的端口。例如,如果有一个web服务器在serv1上的8080上运行,我想在主机的浏览器上指向serv1:8080,而不是localhost:8080。这样,我就不需要每次需要访问新端口时都编辑docker compose文件。注意,这在容器之间已经发生了。在我的serv1容器中,我可以通过serv2:6379访问redis守护程序。无需在foresight中公开端口或其他任何内容,它们位于同一网络上,只需工作即可。“我希望在主人身上有这样的行为。”我明白。但我认为不能将DNS上的内部服务发现与主机上的服务公开(通过端口绑定完成)混为一谈。我也怀疑仅仅暴露所有端口是否是一种好的做法。因此,要从主机访问服务,我认为端口绑定并不是一个好方法(至少我不知道这种方法)。来自docker.com:[expose]-“在不将端口发布到主机的情况下公开端口…”
    expose:
      - "6379"
    
    ports:
      - "6379:6379"
    expose:
      - "6379"
    
    $ docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container_name_or_id
    
    172.19.0.9
    
    # /etc/hosts
    
    172.19.0.9 container_name