我正在尝试在Docker Swarm模式下使用nginx-proxy。我有一个用于nginx-proxy的堆栈和一个用于whoami容器的堆栈,该容器已被复制了3次。
问题是,当我查询群集时,我总是会收到来自同一whoami的响应。当我按下docker service scale whoami_whoami=1
时,nginx会以503
状态码进行回复,这意味着它一直在询问被删除的副本之一。
# proxy.yml
version: '3.8'
networks:
proxy:
driver: overlay
name: proxy
services:
nginx:
image: jwilder/nginx-proxy:latest
networks:
- proxy
environment:
- HTTPS_METHOD=noredirect
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
# - ${CLU_ROOT}/proxy/certs:/etc/nginx/certs:ro
ports:
- 80:80
# - 443:443
deploy:
placement:
constraints:
- node.role == manager
# whoami.yml
version: '3.8'
networks:
proxy:
external: true
services:
whoami:
image: jwilder/whoami:latest
networks:
- proxy
environment:
- VIRTUAL_HOST=whoami.dev.interne.eseo.fr
deploy:
replicas: 3
我当时认为nginx会将请求发送给“ whoami”,而Swarm的作用是在副本之间保持平衡。我错了吗?
另一方面,当我发布whoami服务的端口8000
并单击:while sleep 1; do clear; curl whoami....:8000; done
时,每个回复都来自不同的副本。
预先感谢
答案 0 :(得分:0)
nginx-proxy提供的模板文件错误。 代替使用服务的DNS名称(在我的情况下为whoami_whoami),它使用服务的一个容器的IP(这就是为什么我总是得到相同的容器)的原因。
一旦模板文件被修复,nginx-proxy就会使用Swarm模式负载平衡器来连接副本。
要解决此问题,请完成2个任务:
1。更新堆栈文件以安装自定义nginx.tmpl:
# proxy.yml
...
services:
nginx:
image: jwilder/nginx-proxy:latest
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
- ./nginx.tmpl:/app/nginx.tmpl:ro # <=== Add this line to your service.
...
2。更新nginx.tmpl
文件中的“定义上游”部分。
{{ define "upstream" }}
server {{ index .Container.Labels "com.docker.swarm.service.name" }}:{{ .Address.Port }};
# {{ if .Address }}
# {{/* If we got the containers from swarm and this container's port is published to host, use host IP:PORT */}}
# {{ if and .Container.Node.ID .Address.HostPort }}
# # {{ .Container.Node.Name }}/{{ .Container.Name }}
# server {{ .Container.Node.Address.IP }}:{{ .Address.HostPort }};
# {{/* If there is no swarm node or the port is not published on host, use container's IP:PORT */}}
# {{ else if .Network }}
# # {{ .Container.Name }}
# server {{ .Network.IP }}:{{ .Address.Port }};
# {{ end }}
# {{ else if .Network }}
# # {{ .Container.Name }}
# {{ if .Network.IP }}
# #server {{ .Network.IP }} down;
# {{ else }}
# server 127.0.0.1 down;
# {{ end }}
# {{ end }}
{{ end }}
原始的nginx.tmpl文件可以从这里下载:https://raw.githubusercontent.com/nginx-proxy/nginx-proxy/master/nginx.tmpl。