8

docker swarm のデフォルトの nginx 構成 (lets-nginx プロジェクトに従って) で、lets -nginxを介して nginx を実行しています。

サービス:

  ssl:
    image: smashwilson/lets-nginx
    networks:
      - backend
    environment:
      - EMAIL=sas@finestructure.co
      - DOMAIN=api.finestructure.co
      - UPSTREAM=api:5000
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - letsencrypt:/etc/letsencrypt
      - dhparam_cache:/cache

  api:
    image: registry.gitlab.com/project_name/image_name:0.1
    networks:
      - backend
    environment:
      - APP_SETTINGS=/api.cfg
    configs:
      - source: api_config
        target: /api.cfg
    command:
      - run
      - -w
      - tornado
      - -p
      - "5000"

apiswarm オーバーレイ ネットワークのポート 5000 で実行されるフラスコ アプリですbackend

サービスが最初に起動されると、すべて正常に動作します。ただし、3 つのノード群のノード間でコンテナーを移動apiするように を更新するたびに、トラフィックを新しいコンテナーにルーティングできません。apinginx

nginx ログで、新しいコンテナーが 10.0.0.4 にあるときに、古い内部 IP (たとえば 10.0.0.2) に固執していることがわかります。

nginx が新しい IP を「認識」できるようにするには、nginx コンテナーを再起動するか、nginx コンテナーdocker execkill -HUPnginx プロセスを再起動する必要があります。

nginx コンテナの名前解決を自動的に更新するより良い方法はありますか?

4

2 に答える 2

10

@Moemaのポインターのおかげで、これに対する解決策を思いつきました。nginx が IP の変更を取得できるようにするには、lets-nginx のデフォルト設定を次のように調整する必要があります。

  resolver 127.0.0.11 ipv6=off valid=10s;
  set $upstream http://${UPSTREAM};
  proxy_pass $upstream;

これは docker swarm のリゾルバを TTL で使用し、変数を設定して、nginx に群れの名前検索を強制的に更新させます。

于 2017-10-10T10:27:06.607 に答える