別のスタックにあるサービスにアクセスするにはどうすればよいでしょうか?

別のスタックにあるサービスにアクセスするにはどうすればよいでしょうか?

私は docker swarm 構成を持っており、そこに 2 つのスタック (mainおよびmon) を展開しました。1 つのスタックでポートを公開し、別のスタックからそれを参照することができます。ただし、私はそれを行わず、代わりに 127.0.0.11 DNS を使用してアクセスする方法を見つけようとしていました。

私はmonというサービスを持っていますgrafana

使用https://docs.docker.com/docker-cloud/apps/service-links/#別のスタック上のサービスまたはコンテナの検出スタック名を使用して参照できることを示していましたが、試してみると機能せping grafana.monず、無効なホスト名が返されました。

答え1

これを行うには、同じネットワークを使用するようにするだけで、それらは表示されます。私の場合はpublic、すべてのスタックによって外部から参照される というネットワークを定義しました。

docker network create -d overlay --attachable public

そこからdocker-compose.ymlファイルで

networks:
  public:
    external:
      name: public

アクセスするには、サービス名を使用するだけです。

答え2

両方のスタックがオーバーレイ ネットワーク タイプを介して接続できるようにし、両方のスタックの外部に作成されたオーバーレイ ネットワークを両方のスタックが (少なくとも必要なサービス上で) 使用できるようにする必要があります。

スタックが起動する前にオーバーレイ ネットワークを作成する必要があります。そうすることで、接続する必要があるサービスがそれに「接続」できるようになります。

このようにネットワークを作成します

docker network create --driver overlay --attachable 

次に、envファイルでサービス名を参照し、サービスがどのような名前で呼び出されているかを確認します。

docker service ls

ID              NAME                     MODE          REPLICAS      IMAGE                  PORTS
vkz5vccbmce7    foo-stack_por-service    replicated    1/1           por-service:1.0.0      *:33065->3306/tcp
sjpnrkm1iiha    foo-stack_vic-service    replicated    1/1           vic-service:1.0.0      *:8081->80/tcp
0capavl31oab    bar-stack_tar-service    replicated    1/1           tar-service:1.0.0      *:33066->3306/tcp
9vohh24jt6hy    bar-stack_zen-service    replicated    1/1           zen-service:1.0.0      *:8082->80/tcp

次に、NAME 列からサービスの名前を取得します。例:バースタック tar サービス

デプロイ時に指定したスタック名がサービスにプレフィックスとして付けられることに注意してください。

docker stack ls

NAME                SERVICES            ORCHESTRATOR
foo-stack           2                   Swarm
bar-stack           2                   Swarm

関連情報