web-dev-qa-db-ja.com

docker swarmサービスの前にあるnginx

私はこれが何週間も真剣に行われることを意図していて、まだ結論に至っていないことを考えています。多分私は間違った方向に考える。

あなたが行き来する100のウェブアプリがあるとしましょう。 gitlabの例を使用して、このようなnginx構成が必要です。

location / {
  proxy_pass http://gitlab;
}

Gitlabはdocker service createで作成されているため、nginxは、イングレスネットワーク内のswarm-vip偽のDNS名によってgitlabを解決できます。

ただし、サービスコンテナが実行されている場合のみ。それ以外の場合、[emerg] 1#1: Host not found in upstream "gitlab"が原因でnginxが起動しません

これで、高可用性nginxを実行する必要があり、proxy_passされたアプリが実行されていることを確認するのはあなたの仕事ではありません。

Nginxサービスを更新するたびに、他の100の群サービスの1つだけが同じ2番目の.. wtfでも実行されていない場合、サービスは起動しません。

それがうまくいかない場合、なぜ世界でスウォームで名前解決が必要なのですか?この問題をどのように解決しますか?

Nginx仮想ホストテンプレートの領事的で動的な生成について考えました(docker-nginx-proxyについてさえ考えないでください)。アプリは非常に異なり、各アプリには独自の構成があると言えます。そして、これらすべては特別な理由ではなく、nginxの解決問題を解決するためだけに機能しますか?

6
roothahn

静的に定義されたnginxリバースプロキシをtraefikに交換することをお勧めします。これは、swarm対応であり、サービスがデプロイされて破棄されるときに動的に再構成できます。

次に実装例を示します。

  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"]
  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
  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

上記のルールでは、簡単にするためにコンテナのパス接頭辞を使用していますが、アプリケーションのプロキシに使用する任意のルールを使用できます。

5
BMitch