在docker swarm服务之前的nginx

我正在考虑如何在几个星期内以认真的方式来做这件事情,而且还没有得出结论。 也许我想到了错误的方向。

假设你有一百个networking应用程序来来去去。 你需要一个类似gitlab的例子的nginxconfiguration:

location / { proxy_pass http://gitlab; } 

由于已经使用docker docker service create gitlab,因此nginx将能够通过它的入口networking中的swarm-vip假dns名称来parsinggitlab。

但是:只有服务容器正在运行。 否则,nginx将无法启动,因为[emerg] 1#1: host not found in upstream "gitlab"

现在,当你不得不运行一个高可用性的nginx时,这是一个脖子破碎的事情,而不是确保proxy_pass已经运行的应用程序。

每次你更新nginx服务,如果其他swarm服务中只有一个没有运行,即使是相同的秒。

如果这不起作用,为什么在这个世界上我们需要群体中的名字parsing? 你怎么解决这个问题?

我想过有关consul和dynamic生成nginx虚拟主机模板(甚至不考虑docker-nginx-proxy!),但是这些应用程序是非常不同的,你可以说每个应用程序都有自己的configuration。 而所有这些工作不是因为一个特殊的原因,只是为了解决nginx的解决问题?

我build议换掉静态定义的nginx反向代理,这个代理是可以感知的,可以在部署和销毁服务的时候自动重新configuration。

以下是一个示例实现:

  1. 为traefik创build一个networking与容器交谈:docker docker network create proxy

  2. 做一个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"] 
  1. 示例撰写文件为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 
  1. 使用标签configuration您的应用程序,并在同一networking上。

泊坞窗,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 

上面的规则为容易使用容器的path前缀,但您可以使用任何您喜欢代理您的应用程序的规则。