ちょっと話題の記事

Docker MachineでAmazon EC2をコントロールする

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

はじめに

先日、Dockerから新機能のリリースがありました。

Orchestrating_Docker_with_Machine__Swarm_and_Compose___Docker_Blog

様々な環境にコマンド一発でDocker環境を構築するDocker Machine(ベータ版)、複数のDocker Engineを集約して一つのDocker Engineに見せるクラスタリングツールであるDocker Swarm、そして複数のDockerコンテナで構成されるアプリケーションをデプロイするオーケストレーションツールであるDocker Composeです。

この3つの機能をAWSに特化した形で有しているのがAmazon EC2 Container Service(ECS)ですが、いろいろな環境で使えるツールをDockerがオフィシャルに出してきたという意味で、インパクトのある発表でした。

さて、今回はDocker Machineを使って、Amazon EC2を操作してみたいと思います。なおDocker Machineのドキュメントはこちら

やってみた

今回はAmazon EC2で構築したAmazon Linux上で実行しています。

Docker Machineのインストール

Docker Machineはバイナリファイルで提供されているため、ドキュメントに記載されたリンクからバイナリファイルをダウンロードしてきて、実行権限を付与するだけです。

$ wget https://github.com/docker/machine/releases/download/v0.1.0/docker-machine_linux-386 -O docker-machine
$ chmod 755 docker-machine

試しに実行してみると、ちゃんと動作してることがわかります。

$ sudo ./docker-machine -v
docker-machine version 0.1.0

Docker Machineの作成

Docker MachineはAmazon EC2を始め、Microsoft AzureやDigitalOcean、Google Compute Engine、SoftLayerなど、主要なクラウドサービスほとんどのドライバーが提供されています。今回はAmazon EC2用のドライバーを使用します。

オプションの詳細はドキュメントを参照してください。AMIは東京リージョンにあるUbuntu 14.04 LTSのAMIを使っています。またアクセスキーとシークレットアクセスキーは必須になっているため、IAM Roleによるアクセス権には対応していないようです。

$ 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 ec2
INFO[0000] Launching instance...
INFO[0019] Waiting for SSH on 54.178.155.151:22
INFO[0082] Configuring Machine...
INFO[0209] "ec2" has been created and is now the active machine.
INFO[0209] To point your Docker client at it, run this in your shell: $(docker-machine env ec2)

以下のように、Amazon EC2インスタンスが立ち上がってきます。

EC2_Management_Console

docker-machine lsで確認すると、ちゃんとec2というDocker Machineが登録されています。

$ sudo ./docker-machine ls
NAME   ACTIVE   DRIVER      STATE     URL                         SWARM
ec2    *        amazonec2   Running   tcp://54.178.155.151:2376

Dockerクライアントを使うための環境定義はdocker-machine envで取得出来ます。なので$(docker-machine env ec2)と実行すれば、ec2というDocker Machineを使うための環境変数が設定出来ます。

$ sudo ./docker-machine env ec2
export DOCKER_TLS_VERIFY=yes
export DOCKER_CERT_PATH=/root/.docker/machine/machines/ec2
export DOCKER_HOST=tcp://54.178.155.151:2376

Docker Machine上でコンテナを実行する

docker-machine configを実行すると、Dockerクライアントに渡すためのパラメータが出力されます。

$ docker-machine config ec2
--tls --tlscacert=/root/.docker/machines/ec2/ca.pem --tlscert=/root/.docker/machines/ec2/cert.pem --tlskey=/root/.docker/machines/ec2/key.pem -H tcp://54.178.155.151:2376

なので、コンテナ実行はDockerクライアントにdocker-machine configの出力結果を引数として渡した上で、普通に実行します。

$ sudo docker $(sudo ./docker-machine config ec2) run busybox echo hello classmethod
Unable to find image 'busybox:latest' locally
busybox:latest: The image you are pulling has been verified. Important: image verification is a tech preview feature and should not be relied on to provide security.
Status: Downloaded newer image for busybox:latest
hello classmethod

docker psコマンドで確認すると、コンテナが実行された形跡が確認出来ます。

$ sudo docker $(sudo ./docker-machine config ec2) ps -a
CONTAINER ID        IMAGE               COMMAND                CREATED              STATUS                          PORTS               NAMES
ecef939a6898        busybox:latest      "echo hello classmet   About a minute ago   Exited (0) About a minute ago                       pensive_pasteur

これだけだと、本当にDocker MachineとなっているAmazon EC2上で実行されているのか確証が持てないので、以下のようなこともやってみました。

$ sudo docker $(sudo ./docker-machine config ec2) run busybox wget http://169.254.169.254/latest/meta-data/instance-id -O - | head
i-3ac25bc9

インスタンスメタデータからDocker MachineとなっているAmazon EC2のインスタンスIDが取得出来ています。

EC2_Management_Console 2

ちゃんとEC2上で実行されていますね!

その他のDocker Machineの操作

Docker Machineを停止するにはdocker-machine stopを実行します。

$ sudo ./docker-machine stop ec2

すると以下のようにEC2インスタンス自体が停止します。

EC2_Management_Console 3

Docker Machineを起動するにはdocker-machine startを実行します。

$ sudo ./docker-machine start ec2

すると以下のようにEC2インスタンス自体が起動します。

EC2_Management_Console 4

Docker Machineを削除するにはdocker-machine rmを実行します。

$ sudo ./docker-machine rm ec2

すると以下のようにEC2インスタンスがターミネートされされます。

EC2_Management_Console 5

以上のように、docker-machineコマンドだけで全ての操作が出来ちゃいます。

さいごに

SwarmとComposeを組み合わせることで、どんなクラウドサービスでも同じようにコンテナをオーケストレーション出来るというのは、かなりスゴいことだと思います。最近のDockerは周辺ツールもどんどんオフィシャルに出してきていて、他のベンダがこれまで作ってきたツールとどのような関係性になるのか、というところが気にかかっていますが、これによってDocker周辺が一層盛り上がるのであれば、それはそれで良いのかもしれませんね。SwarmとComposeについても今後触ってみたいと思います。