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