2015年11月12日木曜日

CentOS7 + AWS で docker-machine を試してみた

概要

docker-machine は仮想マシン上に docker-engine が動作する環境を構築することができるツールです
今回は CentOS7 上の docker-machine から AWS の EC2 インスタンス上に docker 環境を構築してみます

環境

  • CentOS7 64bit
  • docker-machine 0.5.0
  • docker-engine 1.8.3

docker-machine インストール

事前に docker-engine のインストールを行っておいてください

  • mkdir ~/mydocker.machine
  • cd ~/mydocker.machine
  • curl -L https://github.com/docker/machine/releases/download/v0.5.0/docker-machine_linux-amd64.zip >machine.zip
  • unzip machine.zip
  • rm machine.zip
  • mv docker-machine* /usr/local/bin

docker-machine -v でバージョンが表示されればインストール完了です

AWS 上での準備

API でもマネージメントコンソールでもどちらでも OK です

VPC およびサブネットの作成

マネージメントコンソールにログインしたら

サービス > VPC -> VPCウィザードの起動

と実行すれば VPC とそれに紐づくサブネットを一気に作成できます
create_vpc_and_subnet.png

VPC を作成したリージョンと VPCID をメモしておいてください
サブネットを作成したゾーンもメモしておいてください

API をコールすることになるので、アカウントが持つアクセスキーとシークレットキーを用意してください

docker-machine の実行

では、 AWS 上にインスタンスを作成し docker-engine が動く環境を構築します

  • 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 aws01

入力しなければいけないのは [Your Access Key], [Your Secret Key], vpc-xxxxxxxx の部分です
VPC およびサブネットを作成したリージョンとゾーンが異なる場合は ap-northeast-1 と c の部分も書き換えてください

上記の場合は ap-northeast-1 リージョンにある vpc-xxxxxxxx 内のサブネットに aws01 というインスタンスを作成します
作成されるインスタンスのタイプは t2.micro になります

しばらく待っていると docker-engine がインストールされたインスタンスが起動します

Running pre-create checks…
Creating machine…
Waiting for machine to be running, this may take a few minutes…
Machine is running, waiting for SSH to be available…
Detecting operating system of created instance…
Provisioning created instance…
Copying certs to the local machine directory…
Copying certs to the remote machine…
Setting Docker configuration on the remote daemon…
To see how to connect Docker to this machine, run: docker-machine env aws01

AWS 上に作成した docker-engine を操作してみる

  • docker-machine ls

で作成したインスタンスの情報を取得できます
IP アドレスを取得するときに API をコールしているので API のコールに失敗するとエラーが表示されます

docker コマンドで AWS 上のインスタンスを操作できる準備をします

  • eval “$(docker-machine env aws01)”

を実行すると以降の docker コマンドの操作が AWS 上のインスタンスに対する操作になります
docker-machine env aws01 だけ実行するとわかりますが、いくつかの環境変数を export するコマンドが出力されます
それを eval しているだけです

例えば すでに CentOS 上で docker-engine が動作しておりイメージが存在しているのであれば eval したあとで docker images とかを実行してみると何もイメージが表示されないことが確認できると思います

  • docker run busybox echo hello world

超簡単なコンテナの実行です
DockerHub から busybox イメージをダウンロードして echo しているだけです
問題なく実行できると思います
終了後に docker ps -a で確認すると終了していることがわかると思います

これだと本当に AWS 上のインスタンスで実行されているかわからないので nginx を動かしてアクセスできるか確認してみます

  • docker run -d -p 8000:80 nginx

nginx のイメージを取得して起動します
インスタンスの 8000 番をコンテナの 80 番にフォーワードして -d でデタッチモードで起動します

  • curl $(docker-machine ip aws01):8000

で Nginx の「Welcome to Nginx」の HTML が返ってくることを確認してください
返ってこない場合は 8000 番がセキュリティグループで閉じられていると思います
docker-machine で作成したインスタンスには docker-machine というセキュリティグループが自動で作成され割り当てられるようで、これが 22 と 2376 しかデフォルトでは空いていませんでした
ポートを開放して再度実行して HTML が返ってくることを確認してください

  • docker-machine aws01 stop

使わなくなったら上記コマンドでインスタンスを停止することができます
再度使いたい場合は start で OK です

最後に

今回は AWS 上で試しましたが docker-machine には driver という概念があり、様々なクラウドサービスや仮想環境にアクセスできる driver が備わっています
https://docs.docker.com/machine/drivers/

今後もいろいろな driver が追加されると思います
どうしても追加してほしい driver があれば pull - req でもいいと思います

テストとかで試すために自分の環境に docker-engine をインストールすることはあると思いますが、プロダクションなどで複数のインスタンスに docker-engine をインストールする場合は docker-machine を使って構築すれば管理が楽になると思います

あとは、SWARM という欄が ls 実行時にあったので docker-swarm と連携して、複数クラウドサービス間で docker クラスタを組めたりする感じでしょうか
この辺りはまた次回にでも試せればと思います

トラブルシューティング

  • Error creating machine: Error with pre-create check: unable to find a subnet in the zone: us-east-1a
    デフォルトのリージョンは us-east-1a にインスタンスを作るみたいで、そこに VPC とサブネットがないと上記のエラーになります

  • Error creating machine: Error in driver during machine creation: Error launching instance: Problem with AWS API call: Non-200 API response: code=400 message=Your requested instance type (t2.micro) is not supported in your requested Availability Zone (ap-northeast-1a). Please retry your request by not specifying an Availability Zone or choosing ap-northeast-1b, ap-northeast-1c.
    デフォルトのインスタンスタイプは t2.micro のようでゾーンによっては t2.micro が推奨されないタイプになります
    その場合に上記のエラーが発生します
    インスタンスを作成するゾーンを変更するかインスタンスタイプを変更 (--amazonec2-instance-type) してあげれば OK です

  • Host already exists: “aws01”
    すでにインスタンスが作成されているため create コマンドが失敗しています
    実際に AWS 上にインスタンスは作成されていないみたいで、不整合が発生しているのでローカルの情報を削除してあげましょう

    docker-machine rm -f aws01

  • Error creating machine: Error with pre-create check: There is already a keypair with the name aws01. Please either remove that keypair or use a different machine name.
    キーペアがすでに作成されているためにエラーが発生しています
    マネージメントコンソールから EC2 -> キーペア -> aws01 を削除して再度実行してください

  • Error creating machine: Error with pre-create check: unable to find a subnet in the zone: ap-northeast-1c
    指定したゾーンにサブネットが存在しない場合に発生するエラーです
    マネージメントコンソールの VPC から該当のゾーンにサブネットを作成しましょう

参考サイト

0 件のコメント:

コメントを投稿