Docker Swarm: Strategies（ストラテジ）

# Strategies（ストラテジ）
原文：https://docs.docker.com/swarm/scheduler/strategy/

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

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

* `spread`
* `binpack`
* `randam`

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

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

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

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

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

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

## spread ストラテジの例

この例では、Swarm は `spread` ストラテジでノードを最適化し、多くのコンテナを起動してみます。Swarm は `node-1` と `node-2` は 2GB のメモリ、2 CPUであり、他のノードではコンテナは動いていません。このストラテジでは `node-1` と `node-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
```

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

## BinPack ストラテジの例

この例では、`node-1` と `node-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` で動きます。

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