この記事は公開されてから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インスタンスが起動します。
クラスタ情報を確認する
以下のように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を試してみたいと思います!