概要
docker-swarm は複数の docker-engine を 1 つの docker-engine として扱うことができるクラスタリングツールです
コンテナがいっぱいになってスケールしたいとき docker-engine をクラスタに追加することで簡単にコンテナをスケールすることができるようになります
今回は例のごとく Getting Started を試してみたので紹介します
環境
- CentOS7 64bit
- docker-machine 0.5.0
- docker-engine 1.8.3
事前準備
docker-swarm は docker-machine の機能を使っているので事前に docker-machine をインストールしてください
http://kakakikikeke.blogspot.jp/2015/11/try-docker-machine-with-aws.html
クラスタをディスカバリするためのトークンを生成する
docker-swarm で生成するクラスタはトークンを使って、どのクラスタかを管理します
まずはトークンを作成するために 1 台マシンを構築します
docker-machine create --driver amazonec2 --amazonec2-access-key [Your Access Key] --amazonec2-secret-key [Your Secret Key] --amazonec2-vpc-id vpc-xxxxxxxx --amazonec2-region ap-northeast-1 --amazonec2-zone c token-machine
この辺のコマンドは前回の docker-machine の紹介で記載したコマンドと同じです
10 分くらいでインスタンスが立ち上げるので待ちましょう
作成できたら、マシンを確認後、環境変数を読み込みます
- docker-machine ls
eval "$(docker-machine env token-machine)"
そしてこのマシン上で 1 つコンテナを立ち上げます
コンテナの元イメージになるのは DockerHub で公開されている swarm というイメージを使います
- docker run swarm create
これを実行するとイメージのダウンロードが始まり、その後コンテナが起動され、以下のようにコンソールに出力されます
Unable to find image ‘swarm:latest’ locally
latest: Pulling from library/swarm
2bc79aec8ea0: Pull complete
dc2fb86a875a: Pull complete
435e648d0f23: Pull complete
e16042a92d05: Pull complete
045bd7b00b5b: Pull complete
3caea1253d76: Pull complete
2b4c55187a27: Pull complete
6b40fe7724bd: Pull complete
Digest: sha256:51a30269d3f3aaa04f744280e3c118aea032f6df85b49819aee29d379ac313b5
Status: Downloaded newer image for swarm:latest
6c56e07a671372421a6724ce79047d2f
この出力の最後の文字列「6c56e07a671372421a6724ce79047d2f」これをトークンとして使います
クラスタ内でのマスターノードを作成する
トークンが取得できたらクラスタを構築していきます
docker-swarm のクラスタの世界ではマスターと、それ以外のエージェントノードで構成されます
まずはマスターノードを作成する必要があります
docker-machine create --driver amazonec2 --amazonec2-access-key [Your Access Key] --amazonec2-secret-key [Your Secret Key] --amazonec2-vpc-id vpc-xxxxxxxx --amazonec2-region ap-northeast-1 --amazonec2-zone c --swarm --swarm-master --swarm-discovery token://6c56e07a671372421a6724ce79047d2f swarm-master
コマンドが長くなってきました
前半のドライバの指定やアクセスキーの指定は同じです
違うのは --swarm
以降のコマンドでこれを指定することでクラスタとして作成することができます
--swarm-master
オプションを付けることでマスターとしてノードを立ち上げることができます
そして、先ほど作成したトークンを --swarm-discovery
オプションを使って指定します
無事ノードが作成されれば完了です
エージェントノードを追加する
マスターノードができたらエージェントノードを追加していきます
クラスタをスケールさせたいときにはこのエージェントノードを追加していきます
docker-machine create --driver amazonec2 --amazonec2-access-key [Your Access Key] --amazonec2-secret-key [Your Secret Key] --amazonec2-vpc-id vpc-xxxxxxxx --amazonec2-region ap-northeast-1 --amazonec2-zone c --swarm --swarm-discovery token://6c56e07a671372421a6724ce79047d2f agent01
コマンドは先程のコマンドとほぼ同じです
--swarm-master
の指定がないのと作成するノード名がことなるだけです
こんな感じで agent02 まで作成しましょう
作成できたノードを確認する
- docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM
token-machine * amazonec2 Running tcp://xx.xx.xx.xx:2376
swarm-master - amazonec2 Running tcp://xx.xx.xx.xx:2376 swarm-master (master)
agent01 - amazonec2 Running tcp://xx.xx.xx.xx:2376 swarm-master
agent01 - amazonec2 Running tcp://xx.xx.xx.xx:2376 swarm-master
でノードの一覧を確認することができます
SWARM
の欄にマスターノードの名前が記載されていることが確認できると思います
また、クラスタ内のマスターノードには (master) があると思います
docker-machine
コマンドの他に docker-info
コマンドでもクラスタの状況を確認することができます
クラスタ内にコンテナを作成する
まずは docker
コマンドでこのコンテナを操作できるようにします
eval "$(docker-machine env --swarm swarm-master)"
env コマンドで環境を表示させ、eval で評価します
これで docker コマンドをコンテナ内で使うことができます
あとはいつも通り docker run すればマスターノードが適当なエージェントノード内にコンテナを作成してくれます
- docker run hello-world
- docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
103e4ed46f78 hello-world "/hello" 2 minutes ago Exited (0) 2 minutes ago agent01/drunk_kalam
最後に
紹介は以上です
ノードを増やしてスケールさせたい場合は docker-machine create
して、ノードを削除したい場合は docker-machine rm
すれば OK です
docker-machine rm でマスターノードを指定するとクラスタがおかしくなるので注意してください
コンテナの数が数百や数千を超えるような場合には非常に便利な機能だと思いました
コンテナの数やコンテナのリソース消費を監視してキャパシティプランニングまでやってくれると非常に嬉しいなと思いました
いまマシンが足りないから自動で EC2 上にマシンを構築してクラスタに追加しましたとか
さすがに現状だとそこまではやってくれないっぽいです
0 件のコメント:
コメントを投稿