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



我有一个非容器化的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问题。

有一个解决方案,你可以实现。 首先启动 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

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代理。

最新更新