使用nginx将代理转换为Docker服务

时间:2017-02-24 20:09:56

标签: nginx docker docker-swarm docker-swarm-mode

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

0 个答案:

没有答案