【问题标题】:Resolve docker container IP from host OS using container name使用容器名称从主机操作系统解析 docker 容器 IP
【发布时间】:2020-09-11 23:37:48
【问题描述】:

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

由于容器 IP 可以在重启时更改,我不想在 nginx 配置文件中使用它们。我一直在寻找一种简单的方法来引用容器。 Docker 容器可以通过容器名称相互引用,即容器名称的 DNS 查找给出容器的 IP。我正在寻找类似的东西,但名称应该可以从主机操作系统解析。

约束:

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

我已经尝试过 mageddo/dns-proxy-server。它应该可以解析容器名称,但即使在设置了正确的环境变量后也无法解析。

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

PS:虽然以 Nginx 为例,但 DNS 查找功能在很多其他场景中都有帮助。所以我正在寻找 DNS 查找解决方案,而不仅仅是解决 nginx 问题。

【问题讨论】:

    标签: linux docker ubuntu dns dnsmasq


    【解决方案1】:

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

    相反,您可以使用 docker run -p 选项或 Compose 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 代理。

    【讨论】:

    • 是的,您需要重新启动容器才能添加 -p 选项。您需要为各种日常操作删除和重新创建容器(包括将底层映像更改为较新的应用程序代码或进行安全更新),这不应该成为障碍。
    【解决方案2】:

    有一个您可以实施的解决方案。先启动 DNS 服务器。

    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
    

    【讨论】:

    • 除非我使用 --hostname 创建容器,否则它不起作用。我不希望修改正在运行的容器的设置。它应该使用默认主机名,即容器名称,就像它在容器内部一样。
    • Dojo,Docker 不提供开箱即用的功能。我遇到过这个问题,这是我找到的最佳解决方案,因为最后,您需要针对 IP 指定限定名称,如果 IP 发生变化,这就是 DNS 服务器会密切关注的内容。
    猜你喜欢
    • 1970-01-01
    • 2016-09-11
    • 2022-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    相关资源
    最近更新 更多