LoginSignup
6
5

More than 5 years have passed since last update.

Docker Swarm: Strategies(ストラテジ)

Last updated at Posted at 2015-07-04

Strategies(ストラテジ)

原文:https://docs.docker.com/swarm/scheduler/strategy/

Docker Swarm は、ノードの順番に複数ストラテジ(stragegy;方針)機能によって(コンテナの起動を)スケジュールします。選択したストラテジによって、 Swarm が順番を算出します。新しいコンテナを作成するとき、Swarm は選択したストラテジに従って、コンテナを置くために最も順位の高いノードを算出します。

順位付けのストラテジを選択するには、swarm manage コマンドに --strategy フラグを使い、ストラテジ値を指定します。現時点でサポートしている値は:

  • spread
  • binpack
  • randam

spreadbinpack ストラテジは、ノードで利用可能な CPU 、RAM 、実行中のコンテナ数から順位を算出します。random ストラテジは計算をしません。ノードをランダムに選択し、主にデバッグ用に使います。

ストラテジを選択するゴールは、あなたの会社の必要性に従い、Swarm を最適化することです。

spread ステラテジの下では、Swarm はノードで実行中のコンテナ数 に応じて最適化します。pinback ストラテジは利用するノードが最も少なくなるよう最適化します。random ストラテジでは、利用可能な CPU やメモリに関わらずランダムにノードを選びます。

spread ストラテジを使うと、結果として多くのマシンに幅広く展開します。このストラテジの利点は、ノードがダウンしても、失われるのはいくつかのコンテナだけです。

binpack は分散しないストラテジです。これは、使っていないマシンに大きなコンテナを動かす余地を残すためです。この binpack ストラテジの利点は、できるだけ少ないマシンしか使わないよう、Swarm はノードに多くのコンテナを詰め込みます。

もし --strategy を指定しなければ、デフォルトでは spread を使います。

spread ストラテジの例

この例では、Swarm は spread ストラテジでノードを最適化し、多くのコンテナを起動してみます。Swarm は node-1node-2 は 2GB のメモリ、2 CPUであり、他のノードではコンテナは動いていません。このストラテジでは node-1node-2 は同じ順位です。

新しいコンテナを実行するとき、swam クラスタ上で同じランキングのノードが存在するとして、そこからランダムに node-1 をシステムが選びます。

$ docker run -d -P -m 1G --name db mysql
  f8b693db9cd6

  $ docker ps
  CONTAINER ID        IMAGE               COMMAND             CREATED                  STATUS              PORTS                           NODE        NAMES
  f8b693db9cd6        mysql:latest        "mysqld"            Less than a second ago   running             192.168.0.42:49178->3306/tcp    node-1      db

次は別のコンテナで 1GB のメモリを使います。

$ docker run -d -P -m 1G --name frontend nginx
963841b138d8

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED                  STATUS              PORTS                           NODE        NAMES
963841b138d8        nginx:latest        "nginx"             Less than a second ago   running             192.168.0.42:49177->80/tcp      node-2      frontend
f8b693db9cd6        mysql:latest        "mysqld"            Up About a minute        running             192.168.0.42:49178->3306/tcp    node-1      db

コンテナ frontendnode-2 で起動します。これは直前に実行したノードだからです。もし2つのノードがあって、同じメモリや CPU であれば、spread ストラテジは最後にコンテナを実行したノードを選びます。

BinPack ストラテジの例

この例では、node-1node-2 いずれも 2GB のメモリを持ち、コンテナを実行していないとします。ノードが同じとき、コンテナの実行は、今回は swarm によって node-1 が選ばれたとします:

$ docker run -d -P -m 1G --name db mysql
f8b693db9cd6

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED                  STATUS              PORTS                           NODE        NAMES
f8b693db9cd6        mysql:latest        "mysqld"            Less than a second ago   running             192.168.0.42:49178->3306/tcp    node-1      db

これで再び、1GB のメモリを使う別のコンテナを起動してみましょう。

$ docker run -d -P -m 1G --name frontend nginx
963841b138d8

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED                  STATUS              PORTS                           NODE        NAMES
963841b138d8        nginx:latest        "nginx"             Less than a second ago   running             192.168.0.42:49177->80/tcp      node-1      frontend
f8b693db9cd6        mysql:latest        "mysqld"            Up About a minute        running             192.168.0.42:49178->3306/tcp    node-1      db

システムは node-1 上で新しい frontend コンテナを起動します。これはノードは既に集約するようになっているためです。これにより、2GB のメモリが必要なコンテナは node-2 で動きます。

もし2つのノードが同じメモリと CPU であれば、binpack ストラテジは最もコンテナが実行しているノードを選択します。

6
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
5