トポロジに2つのサービスがあるとします
どちらもポート80で実行されていると想定しています。
サービスを作成するときにdocker swarmでクラスターの外部にアクセスしたい場合は、サービスからポートを公開してノード(外部ポート)にマップする必要があります。しかし、たとえばポート80をAPIサービスにマッピングすると、すでにマッピングされているため、Webインターフェースサービスに同じポートをマッピングできません。
これはどのように解決できますか?
私が見る限り、このユースケースはサポートされていません。大きな群れクラスターを作りたいと思っても、そこにすべてのサービスとアプリケーションが存在することはありません。
何か不足していますか?
これを解決するパターンはありますか?
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 [〜#〜] 設定が利用できるようになりました-まだこれを試していません。
すべてがうまくいった場合の最終結果:
service domain
またはservice path
に基づいて適切なサービスに転送します(service path
で問題が発生しました)[EDIT 2016/10/20]
プロキシに接続されている同じオーバーレイネットワーク上の同じ公開されたポートに関する問題については、上記のものすべてを無視してください。
私は自分の穴の設定を取り下げて、やり直しました-すべてが期待どおりに機能しています。Dockerフロープロキシ経由で、異なるドメインを使用して、ポート80で複数の(異なる)サービスにアクセスできます。
また、上記の自動設定を使用する-すべてが魅力のように機能しています。
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
公開する必要がある場合は、別のポートを使用します。
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に接続します。