代码之家  ›  专栏  ›  技术社区  ›  Dojo

使用容器名从主机操作系统解析docker容器IP

  •  0
  • Dojo  · 技术社区  · 4 年前

    我有一个非容器化nginx实例作为容器化和非容器化服务的反向代理。

    因为容器IP可以在重新启动时更改,所以我不想在nginx配置文件中使用它们。我在找一个简单的方法来引用容器。

    限制条件:

    解决方案应适用于现有容器。所以没有 docker run ...

    我试过mageddo/dns代理服务器。它应该解析容器名,但即使设置了正确的环境变量,它也不会解析。

    sudo docker run -d \
    --restart unless-stopped \
    --name dns-proxy-server \
    -p 5380:5380 \
    -e MG_REGISTER_CONTAINER_NAMES=true \
    --hostname dns.mageddo \
    -v /opt/dns-proxy-server/conf:/app/conf \
    -v /var/run/docker.sock:/var/run/docker.sock \
    -v /etc/resolv.conf:/etc/resolv.conf defreitas/dns-proxy-server
    

    0 回复  |  直到 4 年前
        1
  •  0
  •   nischay goyal    4 年前

    docker run --rm --hostname dns.mageddo --name dns-proxy-server -p 5380:5380 \
      -v /opt/dns-proxy-server/conf:/app/conf \
      -v /var/run/docker.sock:/var/run/docker.sock \
      -v /etc/resolv.conf:/etc/resolv.conf \
      defreitas/dns-proxy-server
    

    然后运行测试容器来测试主机名

    docker run --hostname test.intranet nginx
    

    ping test.intranet
    PING test.intranet (172.18.0.3) 56(84) bytes of data.
    64 bytes from 172.18.0.3 (172.18.0.3): icmp_seq=1 ttl=64 time=0.072 ms
    64 bytes from 172.18.0.3 (172.18.0.3): icmp_seq=2 ttl=64 time=0.050 ms
    64 bytes from 172.18.0.3 (172.18.0.3): icmp_seq=3 ttl=64 time=0.052 ms
    64 bytes from 172.18.0.3 (172.18.0.3): icmp_seq=4 ttl=64 time=0.046 ms
    
        2
  •  0
  •   David Maze    4 年前

    Docker之外的进程无法访问Docker DNS系统;除了一个特定配置之外,它们也无法访问容器专用IP。

    docker run -p 选择或合成 ports: 选择。您指定的端口号将是稳定的,并且在重新启动容器时仍然有效。如果不希望在主机外直接访问端口,可以将其限制为只能从主机的环回接口访问。

    docker run -d --name backend \
      -p 127.0.0.1:8001:3000 \      # port 8001 reaches this container, only on lo0
      ...
    
    match /backend/ {
      proxy_pass http://localhost:8001/
    }
    

    如果你的nginx配置需要使用Docker内部DNS,你也可以在Docker内部运行nginx代理。