ちょっと話題の記事

Amazon EC2でDocker Machine + Docker Swarmを使う

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

前回、Docker MachineでAmazon EC2をコントロールしてみました。今回は更にDocker Swarmを組み合わせて、Amazon EC2上にDockerクラスタを構成してみたいと思います。

やってみた

前回同様、Amazon EC2で構築したAmazon Linux上で実行しています。

クラスタを作成する

クラスタを作成し、クラスタグループを構成するためのクラスタIDを発行します。

$ sudo docker run swarm create
934afbacc9e635c52e8b6544a2eba998

マスターノードとなるDocker Machineを作成する

クラスタの管理を行うマスターノードとなるDocker Machineを作成します。前回と違うのは--swarmオプション以降で、マスターノードとなるために--swarm-masterオプションを付与しています。また--swarm-discoveryで上述のクラスタIDをトークンとして指定します。

$ sudo ./docker-machine create --driver amazonec2 --amazonec2-access-key YOUR_ACCESS_KEY --amazonec2-secret-key YOUR_SECRET_KEY --amazonec2-region ap-northeast-1 --amazonec2-ami ami-a1bf56a1 --amazonec2-vpc-id YOUR_VPC_ID --swarm --swarm-master --swarm-discovery token://934afbacc9e635c52e8b6544a2eba998 swarm-master
INFO[0000] Launching instance...
INFO[0024] Waiting for SSH on 54.178.186.113:22
INFO[0088] Configuring Machine...
INFO[0218] Configuring Swarm...
INFO[0222] "swarm-master" has been created and is now the active machine.
INFO[0222] To point your Docker client at it, run this in your shell: $(docker-machine env swarm-master)

クラスタノードとなるDocker Machineを作成する

クラスタノードとなるDocker Machineでは--swarm-masterオプションを付与しません。

$ sudo ./docker-machine create --driver amazonec2 --amazonec2-access-key YOUR_ACCESS_KEY --amazonec2-secret-key YOUR_SECRET_KEY --amazonec2-region ap-northeast-1 --amazonec2-ami ami-a1bf56a1 --amazonec2-vpc-id YOUR_VPC_ID --swarm --swarm-discovery token://934afbacc9e635c52e8b6544a2eba998 swarm-node1
INFO[0000] Launching instance...
INFO[0021] Waiting for SSH on 54.64.236.91:22
INFO[0085] Configuring Machine...
INFO[0222] Configuring Swarm...
INFO[0225] "swarm-node1" has been created and is now the active machine.
INFO[0225] To point your Docker client at it, run this in your shell: $(docker-machine env swarm-node1)

今回はもう1つ、合計2つのクラスタノードを作成します。

$ sudo ./docker-machine create --driver amazonec2 --amazonec2-access-key YOUR_ACCESS_KEY --amazonec2-secret-key YOUR_SECRET_KEY --amazonec2-region ap-northeast-1 --amazonec2-ami ami-a1bf56a1 --amazonec2-vpc-id YOUR_VPC_ID --swarm --swarm-discovery token://934afbacc9e635c52e8b6544a2eba998 swarm-node2
INFO[0000] Launching instance...
INFO[0024] Waiting for SSH on 54.92.100.248:22
INFO[0087] Configuring Machine...
INFO[0223] Configuring Swarm...
INFO[0227] "swarm-node2" has been created and is now the active machine.
INFO[0227] To point your Docker client at it, run this in your shell: $(docker-machine env swarm-node2)

以下のように3つのEC2インスタンスが起動します。

EC2_Management_Console

クラスタ情報を確認する

以下のようにdocker-machine lsを実行すると、SWARM項目にマスターノード名が入った形で表示されます。

$ sudo ./docker-machine ls
NAME           ACTIVE   DRIVER      STATE     URL                         SWARM
swarm-master            amazonec2   Running   tcp://54.178.186.113:2376   swarm-master (master)
swarm-node1             amazonec2   Running   tcp://54.64.236.91:2376     swarm-master
swarm-node2    *        amazonec2   Running   tcp://54.92.100.248:2376    swarm-master

マスターノードに対して操作を行うので、マスターノード用の環境変数をセットします。

$ $(sudo ./docker-machine env --swarm swarm-master)

マスターノードに対してdocker infoを実行すると、以下のようにクラスタを構成する各ノードの情報が取得できます。

$ sudo -E docker info
Containers: 4
Nodes: 3
 swarm-master: 54.178.186.113:2376
  └ Containers: 2
  └ Reserved CPUs: 0 / 1
  └ Reserved Memory: 0 B / 992.5 MiB
 swarm-node1: 54.64.236.91:2376
  └ Containers: 1
  └ Reserved CPUs: 0 / 1
  └ Reserved Memory: 0 B / 992.5 MiB
 swarm-node2: 54.92.100.248:2376
  └ Containers: 1
  └ Reserved CPUs: 0 / 1
  └ Reserved Memory: 0 B / 992.5 Mi

クラスタにコンテナを起動する

マスターノードに対しdocker runでコンテナを起動します。

$ sudo -E docker run -d memcached

すると以下のように、swarm-node1でmemcachedコンテナが起動します。

$ sudo -E docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
9254f7e5d6da        memcached:1         "memcached"         32 seconds ago      Up 3 seconds        11211/tcp           swarm-node1/goofy_perlman

更にもう一度、コンテナを起動します。

$ sudo -E docker run -d memcached
d4c85ea5113e1809c479af10935c01d6944199bd93d1633329d3d9b91605ae89

すると、次はswarm-node2のほうでmemcachedコンテナが起動しました!

$ sudo -E docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS                  PORTS               NAMES
d4c85ea5113e        memcached:1         "memcached"         4 seconds ago        Up Less than a second   11211/tcp           swarm-node2/modest_brattain
9254f7e5d6da        memcached:1         "memcached"         About a minute ago   Up About a minute       11211/tcp           swarm-node1/goofy_perlman

ということで、ちゃんと分散されたDocker Machineの上で、Dockerコンテナがクラスタとして起動します!

さいごに

Elasticsearchのような分散アプリケーションをコンテナとしてボンボン立ち上げられるので、リソース追加が簡単にできそうです。

次はDocker Composeを試してみたいと思います!