我正在考虑如何在数周内以严肃的方式完成这项工作并且尚未得出结论.
也许我想到了错误的方向.
假设您有一百个来来往往的网络应用程序.
你想要一个类似于gitlab的Nginx配置:
location / {
proxy_pass http://gitlab;
}
由于gitlab已经使用docker service create创建,Nginx将能够通过它的入口网络中的swarm-vip假dns名称来解析gitlab.
但是:仅当服务容器正在运行时.否则,Nginx将无法启动,因为[emerg] 1#1:在上游找不到主机“gitlab”
现在,当你必须运行高可用性Nginx时,这是一个破解者,确保proxy_pass的应用程序正在运行并不是你的事.
每当你更新Nginx服务时,如果其他一百个群服务中只有一个即使在同一秒内也没有运行,它就不会出现.. wtf?
如果这不起作用,为什么我们需要在群体中进行名称解析呢?
你怎么解决这个问题?
我考虑过Nginx虚拟主机模板的consul和动态生成(甚至不考虑docker-Nginx-proxy!),但是应用程序非常不同,你可以说每个应用程序都有自己独立的配置.所有这些工作不是出于特殊原因,只是为了解决Nginx的解决问题?
最佳答案
我建议换掉静态定义的Nginx反向代理,用于知道swarm的traefik,并且可以在部署和销毁服务时动态重新配置自身.
这是一个示例实现:
>为traefik创建一个与容器对话的网络:docker network create proxy
>制作一个traefik.toml,这是一个例子:
traefik.toml
accessLogsFile = "/proc/1/fd/1"
defaultEntryPoints = ["http"]
[entryPoints]
[entryPoints.http]
address = ":80"
[web]
address = ":8080"
[docker]
endpoint = "unix:///var/run/docker.sock"
domain = "localhost"
watch = true
swarmmode = true
constraints = ["tag==frontend"]
> traefik的示例撰写文件:
泊坞窗,compose.traefik.yml
version: '3'
networks:
proxy:
external:
name: proxy
services:
traefik:
image: traefik:latest
volumes:
- ./traefik.toml:/etc/traefik/traefik.toml:ro
- /var/run/docker.sock:/var/run/docker.sock
ports:
- 80:80
- 8080:8080
networks:
- proxy
restart: unless-stopped
>使用标签在同一网络上配置您的应用.
泊坞窗,compose.app.yml
version: '3'
networks:
proxy:
external: true
services:
webtest:
image: Nginx:latest
networks:
- default
- proxy
labels:
- traefik.frontend.rule=PathPrefixStrip:/webtest
- traefik.port=80
- traefik.docker.network=proxy
- traefik.tags=frontend
restart: unless-stopped
为简单起见,上面的规则使用容器的路径前缀,但您可以使用您喜欢的任何规则代理您的应用程序.