2016-07-23 19 views
9

はあなたのトポロジ上の2つのサービスがあるとしドッキングウィンドウの群れモード複数のサービスで同じポート

  1. API
  2. Webインターフェイスが

両方がポートで80

オンを実行していると仮定ドッカーがサービスを作成するときにクラスタ外にアクセスしたい場合は、ポートを公開してサービスからノード(外部ポート)にマッピングする必要があります。しかし、ポート80をマップしてAPIサービスを言うと、すでにマップされているため、Web Interfaceサービスと同じポートをマップできません。

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

私の知る限り、このユースケースはサポートされていません。あなたが大きな集団を持つことを望んでいても、そこにあなたのすべてのサービスとアプリケーションは不可能です。

私に何か不足していますか?

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

+0

質問に混乱します。同じポートに2つのものをマップすることができないという点に関して、ドッカー固有のものは何もありません。彼らはあなたのコンテナ内のポート80で実行されますが、それらを異なる外部ポートにマップします。 – johnharris85

+0

@Jハリスはい私は主な質問を編集して外部ポートを指定します。しかし、APIサービス80のポートを外部ポート80にマップすると、サービスのために再度マップすることはできません。Web Interface – bitgandtter

+0

正解、どのようにドッカーなしでこれを解決しますか? – johnharris85

答えて

3

使用する異なるポートそれらが公に露出する必要がある場合:

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

、次いで第2の例において

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

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

curl http://api:80

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

+0

ちょっと@BMitchですが、APIがポート8080上でインターネットに公開されているため、ユースケースは達成されません。これは、ポート80上にあると仮定した場合です。いずれにしても、1つの大きな集団クラスタと複数の異なるサービスが必要な場合、これらのサービスのいくつかをポート80でインターネットに公開する必要があります。 – bitgandtter

+0

Dockerが提供するソリューションの説明を提供しています。現在の実装では、2つの異なるサービスのサービス検出メカニズムを通じて同じポートを公開することを許可するオプションはありません。私が考えることのできる回避策は、ポートの代わりにIPでサービスを公開する別のツールや、リクエストを解釈してコンテンツに基づいてAPIまたはWebサーバーに送信するプロキシを使用することです。 – BMitch

+0

@bitgandtter同じポート経由で2つのサービスをエクスポートすることはほとんど意味がありません。ロードバランサが正しいサービスにトラフィックを送信できるのは、httpヘッダーを調べることだけです。実行可能ですが、確かに効率的ではなく、より複雑です。あなたのユースケースでは、Webパーツにはポート80/443を使用し、APIパーツには他のもの(範囲> = 30000)を使用するのが一般的です。 – Alkaline

3

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 
4

あなたはイージーとして使用するDocker Flow:Proxyに見ることができます構成するリバースプロキシ

しかし、他のコメンテーターが指摘しているように、Docker 1.12 swarmモードは、同じポート(80または8080など)を公開する複数のサービスに根本的な問題があります。 メッシュルーティングの魔法には、基本的にはTCP/IP、つまりIPアドレス+ポートを意味するレベル4の4つの魔法があります。 複数のサービスが(例えば)ポート8080にリストされていると、物事が乱雑になる。メッシュルーターは、ポート8080に向かうトラフィックを、同じポートを公開するあらゆるサービスに喜んで届けます。

swarmモードではオーバーレイネットワークを使用して物事を分離することができますが、サービスをプロキシ(オーバーレイネットワーク)に接続する必要があるときに問題が発生します - その時点では、私が今問題を抱えているところです)。

私が今解決した解決策は、プロキシフェーシング(オーバーレイ)ネットワークに関する限り、ネットに公開する必要があるサービスを一意にすることです。 swarm!)、実際には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 

それはdocumentationだあたりとしてあなたはその後、リバースプロキシを設定

注:私は今、利用可能な新しいAUTO設定がある見ます - まだ試したことがありません。

最終結果:

どちらか service domainまたは service pathに基づいて、適切なサービスに(それのconfig通話用と8080、そのパブリックネットのことをOFFキープ!)
  • ポート80でリッスンプロキシ、443
  • プロキシ転送し、(私はservice pathの問題を持っていました)
  • サービスは、隔離されたオーバーレイネットワークを介して内部的に通信できます。
  • サービスが付属同じオーバーレイ・ネットワーク上の同じさらさポートに関する問題についての上記のすべてのものを無視[EDITの2016年10月20日]

群れに不必要なポートを公開していません。代理人に。

私は穴のセットアップを破棄し、もう一度やり直しました。今はすべて期待どおりに動作しています。私は、ドッカーフロープロキシ経由で、異なるドメインを使用してポート80で複数の(異なる)サービスにアクセスできます。

また、自動設定を使用すると、すべてが魅力的なように機能しています。

関連する問題