web-dev-qa-db-ja.com

docker swarm mode複数のサービスの同じポート

トポロジに2つのサービスがあるとします

  1. API
  2. ウェブインターフェース

どちらもポート80で実行されていると想定しています。

サービスを作成するときにdocker swarmでクラスターの外部にアクセスしたい場合は、サービスからポートを公開してノード(外部ポート)にマップする必要があります。しかし、たとえばポート80をAPIサービスにマッピングすると、すでにマッピングされているため、Webインターフェースサービスに同じポートをマッピングできません。

これはどのように解決できますか?

私が見る限り、このユースケースはサポートされていません。大きな群れクラスターを作りたいと思っても、そこにすべてのサービスとアプリケーションが存在することはありません。

何か不足していますか?

これを解決するパターンはありますか?

19
bitgandtter

Docker Flow:Proxy を調べて、設定が簡単なリバースプロキシとして使用できます。

しかし、他のコメンテーターが指摘したように、Docker 1.12スウォームモードには、複数のサービスが同じポート(80や8080など)を公開するという根本的な問題があると思います。それは(I THINK)メッシュルーティングマジックに要約されます。これはレベル4の4つのことであり、基本的にはTCP/IPを意味します。つまり、IPアドレス+ポートです。そのため、たとえばポート8080に複数のサービスがリストされていると、事態が複雑になります。メッシュルーターは、ポート8080に向かうトラフィックを、同じポートを公開するすべてのサービスに問題なく配信します。

スウォームモードのオーバーレイネットワークを使用して、物事を互いに分離できますが、サービスをプロキシ(オーバーレイネットワーク)に接続する必要があるときに問題が発生します-その時点で、物事が混同しているように見えます(そして、これが私がいる場所です)現在、困難を抱えています)。

この時点で私が持っている解決策は、プロキシに面している(オーバーレイ)ネットワークに関する限り、Net Useポートに公開する必要のあるサービスを一意にすることです(それらは群に公開される必要はありません!)、そして、実際にDocker Flow Proxyのようなものを使用して、目的のポートで着信トラフィックを処理します。

私が始めるためのクイックサンプル(おおよそ this に基づいています:

    docker network create --driver overlay proxy
    docker network create --driver overlay my-app
    # App1 exposed port 8081
    docker service create --network proxy --network my-app --name app1 myApp1DockerImage
    docker service create --name proxy \
    -p 80:80 \
    -p 443:443 \
    -p 8080:8080 \
    --network proxy \
    -e MODE=swarm \
    vfarcic/docker-flow-proxy
    #App2 exposes port 8080
    docker service create --network proxy --network my-app --name app2 myApp2DockerImage

次に、reverseProxyを documentation のように構成します。

注:新しい [〜#〜] auto [〜#〜] 設定が利用できるようになりました-まだこれを試していません。

すべてがうまくいった場合の最終結果:

  • ポート80、443でリッスンしているプロキシ(設定呼び出しには8080なので、パブリックネットをオフにしてください!)
  • プロキシはservice domainまたはservice pathに基づいて適切なサービスに転送します(service pathで問題が発生しました)
  • サービスは、分離されたオーバーレイネットワークを介して内部的に通信できます。
  • サービスがポートを不必要に群に公開しない

[EDIT 2016/10/20]

プロキシに接続されている同じオーバーレイネットワーク上の同じ公開されたポートに関する問題については、上記のものすべてを無視してください。

私は自分の穴の設定を取り下げて、やり直しました-すべてが期待どおりに機能しています。Dockerフロープロキシ経由で、異なるドメインを使用して、ポート80で複数の(異なる)サービスにアクセスできます。

また、上記の自動設定を使用する-すべてが魅力のように機能しています。

6
demaniak

APIとWebインターフェースの両方を公開する必要がある場合は、2つのオプションがあります。サービスに別のポートを使用する

http://my-site.com       # Web interface
http://my-site.com:8080  # API

または、ポート80をリッスンし、パスに従って正しいサービスにリクエストを転送するプロキシを使用します。

http://my-site.com      # Web interface
http://my-site.com/api  # API
5
ronkot

公開する必要がある場合は、別のポートを使用します。

docker service create -p 80:80 --name web nginx

その後

docker service create -p 8080:80 --name api myapi

2番目の例では、パブリックポート8080がコンテナーポート80にマッピングされます。もちろん、パブリックポートを公開する必要がない場合は、コンテナー名とコンテナーポートを使用して、同じネットワーク上のコンテナー間のサービスを確認できます。

curl http://api:80

は、apiという名前のコンテナーを見つけ、同じネットワーク上のコンテナーのDNS検出を使用してポート80に接続します。

3
BMitch