docker swarm 服务前的 nginx

sgo*_*ohl 6 nginx docker docker-swarm

我在思考这意味着如何认真地完成数周,但尚未得出结论。也许我想错了方向。

假设您有一百个网络应用程序来来去去。你想要一个像 gitlab 这样的 nginx 配置:

location / {
  proxy_pass http://gitlab;
}
Run Code Online (Sandbox Code Playgroud)

由于 gitlab 是用 来创建的docker service create,nginx 将能够通过它在你的入口网络中的 swarm-vip 假 dns 名称来解析 gitlab。

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

现在,当您必须运行高可用性 nginx 并且确保 proxy_pass 的应用程序正在运行不是您的业务时,这将是一个难题。

每次更新 nginx 服务时,如果其他一百个 swarm 服务中只有一个在同一秒内没有运行,它就不会出现……wtf?

如果这不起作用,为什么我们需要在 swarm 中进行名称解析?你怎么解决这个问题?

我考虑过 consul 和 nginx 虚拟主机模板的动态生成(甚至不要考虑 docker-nginx-proxy!),但是应用程序非常不同,您可以说每个应用程序都有自己的单独配置。而这一切工作不是为了特殊原因,只是为了解决nginx的解决问题?

BMi*_*tch 5

我建议为 traefik 更换静态定义的 nginx 反向代理,它具有群感知能力,并且可以在部署和销毁服务时动态重新配置自身。

这是一个示例实现:

  1. 为 traefik 创建一个与容器通信的网络: 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"]
Run Code Online (Sandbox Code Playgroud)
  1. traefik 的示例撰写文件:

docker-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
Run Code Online (Sandbox Code Playgroud)
  1. 使用标签并在同一网络上配置您的应用程序。

docker-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
Run Code Online (Sandbox Code Playgroud)

为简单起见,上述规则使用容器的路径前缀,但您可以使用任何您喜欢的规则来代理您的应用程序。

  • 不幸的是,traefik 在这一点上很出色,但缺乏 nginx 所具有的其他功能。traefik 无法替代 nginx。 (2认同)