我有一个运行Docker版本1.13.1的Docker swarm。我经常将堆栈的Docker服务(通过docker stack deploy
)部署到这个swarm,我有一个nginx代理服务,它位于端口80和443,作为swarm中各种应用程序的反向代理。
我遇到了使用nginx upstream
功能的问题,就是它缓存了我的服务名称的DNS查询。这工作正常一段时间,但随着更多的堆栈被删除和部署,这些缓存的IP地址变得陈旧,nginx将开始超时或向错误的容器提供请求。
我尝试使用以下技术解决此问题:
[in nginx.conf]
server {
server_name myapp.domain.com;
resolver 127.0.0.11 valid=10s ipv6=off;
set $myapp http://stack_myapp:80; # stack_myapp is the DNS name of the service
location / {
proxy_pass $myapp;
}
}
# other similar server blocks
127.0.0.11似乎是swarm设置的内部DNS服务器的IP地址。这似乎在大多数时间都有效 - 上游服务的IP地址不会长时间缓存,如果上游服务移动,代理将恢复。但是,代理有时仍然会向不正确的地址提供请求,例如,它会向http://10.0.0.12:80/...
提供请求并超时或命中错误的容器。当我运行docker exec proxycontainer ping stack_myapp
时,我得到了正确的IP地址。为什么nginx在ping
执行时无法解析正确的IP?