我正在考虑如何以严肃的方式完成这几个星期,但还没有得出结论。也许我想错了方向。
假设您有一百个来来去去的网络应用程序。你想要一个像 gitlab 例子那样的 nginx 配置:
location / {
proxy_pass http://gitlab;
}
由于 gitlab 是用 创建的docker service create
,nginx 将能够通过它在你的入口网络中的 swarm-vip 假 dns 名称来解析 gitlab。
但是:仅当服务容器正在运行时。否则,nginx 将无法启动,因为 [emerg] 1#1: host not found in upstream "gitlab"
现在,当您必须运行高可用性 nginx 并且确保 proxy_pass 的应用程序正在运行时,这是一个难题。
每次更新 nginx 服务时,如果其他 100 个其他 swarm 服务中只有一个在同一秒内没有运行,它就不会出现.. wtf?
如果这不起作用,为什么我们需要在 swarm 中进行名称解析?你怎么解决这个问题?
我考虑了 nginx 虚拟主机模板的 consul 和动态生成(甚至不要考虑 docker-nginx-proxy!),但是应用程序非常不同,您可以说每个应用程序都有自己的单独配置。而所有这些工作都不是出于特殊原因,只是为了解决 nginx 的解决问题?
我建议将静态定义的 nginx 反向代理换成 traefik,它可以感知集群,并且可以在部署和销毁服务时动态重新配置自身。
这是一个示例实现:
为 traefik 创建一个与容器通信的网络:
docker network create proxy
制作一个 traefik.toml,这是一个例子:
traefik.toml
docker-compose.traefik.yml
docker-compose.app.yml
为简单起见,上述规则使用容器的路径前缀,但您可以使用您喜欢的任何规则来代理您的应用程序。