我有一个运行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?