2016-09-28 4 views
3

私は本番環境でwebsocket接続が必要なウェブサーバーを持っています。私はプロキシとしてnginxとdocker-composeを使用してそれを展開します。 だから私のコンファイルには、次のようになります。私は、複数のインスタンスに「アプリ」サービスを拡張場合スティッキーセッションを伴うドッカーの作成スケール

version: '2' 
services: 
    app: 
    restart: always 

    nginx: 
    restart: always 
    ports: 
     - "80:80" 

さて、ドッキングウィンドウ-COMPOSEは、内部DNS「アプリ」への呼び出しごとにラウンドロビンを実行します。

ドッキングステーションにスティッキセッションを適用するように指示する方法はありますか?

別の解決方法 - nginxを使用して解決する方法はありますか?私は好きではない


考えられる解決策:アプリの

複数の定義

version: '2' 
services: 
    app1: 
    restart: always 

    app2: 
    restart: always 

    nginx: 
    restart: always 
    ports: 
     - "80:80" 

(そして、nginxの設定ファイルに私はAPP1とAPP2の間でスティッキーセッションを定義することができます) 。 https://github.com/docker/dockercloud-haproxy

しかし、これは別のサービスを追加するために私を必要とする(多分nginxのを交換?)とドキュメントがスティッキーセッションについてかなり貧弱です:私は検索から得た


最高の結果。

私はドッカーが作成ファイルに単純な行で設定できるようにしたいと考えています。

ありがとうございます!

+0

これをkubernetesで解決する方法があります。 – Gabbax0r

+0

@ Gabbax0rありがとう!私のインフラがDocker Swarmに基づいているので、私は他のオプションを使い果たしてもそれを試してみます –

答えて

3

jwilder/nginx-proxyをご覧ください。この画像は、VIRTUAL_HOST変数を定義するコンテナをリッスンし、コンテナの作成と削除の設定を自動的に更新するnginxリバースプロキシを提供します。 tpcwangのforkを使用すると、コンテナレベルでIP_HASHディレクティブを使用して、スティッキセッションを有効にすることができます。

nginx: 
    image: tpcwang/nginx-proxy 
    ports: 
    - "80:80" 
    volumes: 
    - /var/run/docker.sock:/tmp/docker.sock:ro 
app: 
    image: tutum/hello-world 
    environment: 
    - VIRTUAL_HOST=<your_ip_or_domain_name> 
    - USE_IP_HASH=1 

のは、それを取得し、実行し、その後app 3にインスタンスを拡張してみましょう:

docker-compose up -d 
docker-compose scale app=3 

あなたはnginxの設定ファイルをチェックすると、あなたが何かを参照してくださいよ

は以下のComposeファイルを考えてみましょうこのように:

docker-compose exec nginx cat /etc/nginx/conf.d/default.conf 

... 
upstream 172.16.102.132 { 
    ip_hash; 
      # desktop_app_3 
      server 172.17.0.7:80; 
      # desktop_app_2 
      server 172.17.0.6:80; 
      # desktop_app_1 
      server 172.17.0.4:80; 
} 
server { 
    server_name 172.16.102.132; 
    listen 80 ; 
    access_log /var/log/nginx/access.log vhost; 
    location/{ 
     proxy_pass http://172.16.102.132; 
    } 
} 

nginxコンテナは3つのインスタンスを自動的に検出し、スティッキセッションを使用してそれらのすべてに要求をルーティングするように構成を更新しました。

アプリにアクセスしようとすると、更新時に常に同じホスト名が報告されることがわかります。 USE_IP_HASH環境変数を削除すると、ホスト名が実際に変更されていることがわかります。つまり、nginxプロキシはラウンドロビンを使用してリクエストのバランスをとっています。

+0

お返事ありがとうございます! ip_hashの唯一の欠点も言及する必要があります。スティッキセッション。クライアントが通常開発者ボックスのみである開発環境では、すべての要求が同じサーバーノードに到達します。解決策は、クライアントをドッカーのconainerに置いて、同じまたはそれ以上の量のサーバースケール番号にスケーリングすることです。 – andreas

関連する問題