1

2 台のマシンのスウォーム クラスターがあります。マシンの 1 つに、ここから単純な Docker 作成デモをインストールしました。ただし、docker-compose scale web=5コマンドを使用してアプリケーションをスケーリングしようとすると、現在のマシンにのみスケーリングされ、期待どおりに swarm クラスター内の他のマシンに新しい Web コンテナーが作成されません。

他の人が見たすべての例で、彼らのscaleコマンドはうまく機能し、複数のノード間でスケーリングするために必要な追加の構成については何も言及されていません。

他に何を試すべきかわからない。どちらのマシンから scale コマンドを実行しても同じ結果が得られます

私が提供できる追加情報を教えてください。

4

2 に答える 2

2

scale コマンドが失敗する原因となる 2 つの問題があることがわかりましたが、適切なマルチホスト ネットワーク設定を使用してもまだ機能していません。

同じ作成アプリ内の別のコンテナーにリンクされた作成アプリケーションからコンテナーをスケーリングする場合- 新しいマルチホスト ネットワーク機能を使用するのではなく、非推奨 (?) の「リンク」機能を使用してコンテナーを結合していたため、これは失敗していました。どうやら、「リンク」は単一のマシンでのみ機能し、複数のマシンに拡張することはできません。(私はこれが事実であると確信していますが、間違っている可能性があります)

リンクされていないコンテナをスケーリングしようとしたとき- これは実際には期待どおりに機能していました。Docker がコンテナーをスケールアウトすることを期待していたマシンで他のコンテナーが実行されていることを忘れていました。したがって、Swarm スケジューラーは、現在のマシンの使用率が最も低かったため、新しくスケーリングされたコンテナーを現在のマシンに配置しました。(これは 2 台のマシンのスウォーム クラスター上にありました)

編集 - 実際の解決策

さて、最終的な問題はbuild、イメージを で指定するのではなく、イメージの作成に使用する構成アプリの一部をスケーリングできないことだったようですimage

そのコンテナをスケーリングしようとしているマシンには、そのイメージを作成するためのビルド ファイルがないため、これは理にかなっていると思いますが、Docker Compose/Swarm はそれを理解し、何らかの形でマシン間でコピーするのに十分スマートであると想定していました.

したがって、解決策は、 でイメージを事前にビルドしてDocker buildから、そのイメージをパブリック Docker Hub または独自のプライベート レジストリにプッシュし、Docker 構成ファイルでそのイメージをimageで作成しようとするのではなく、 で指定することbuildです。

于 2016-02-16T19:45:26.457 に答える
0

できることの 1 つは、Web コンテナにラベルを付け ( など) com.mydomain.myapp.category=web、ラベルにソフトな非アフィニティ ルールを作成することです ( などaffinity:com.mydomain.myapp.category!=~web)。これにより、Swarm はcom.mydomain.myapp.category=web、最初にコンテナーをコンテナーにしない別のコンテナーをホストするようにスケジュールを設定するように指示されます (ただし、コンテナーが既に存在しない場合は、そのコンテナーを既にホストしているコンテナーをスケジュールします)。

そのリポジトリ内の変更された Docker Compose ファイルは次のようになります。

web:
  build: .
  volumes:
   - .:/code
  links:
   - redis
  expose:
   - "5000"
  environment:
   - "affinity:com.mydomain.myapp.category!=~web"
  labels:
   - "com.mydomain.myapp.category=web"
redis:
  image: redis
lb:
  image: tutum/haproxy
  links:
   - web
  ports:
   - "80:80"
  environment:
   - BACKEND_PORT=5000
   - BALANCE=roundrobin
于 2016-02-13T21:40:50.670 に答える