私はこれが何週間も真剣に行われることを意図していて、まだ結論に至っていないことを考えています。多分私は間違った方向に考える。
あなたが行き来する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の解決問題を解決するためだけに機能しますか?
静的に定義されたnginxリバースプロキシをtraefikに交換することをお勧めします。これは、swarm対応であり、サービスがデプロイされて破棄されるときに動的に再構成できます。
次に実装例を示します。
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"]
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
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
上記のルールでは、簡単にするためにコンテナのパス接頭辞を使用していますが、アプリケーションのプロキシに使用する任意のルールを使用できます。