概要
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 とそれに紐づくサブネットを一気に作成できます
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 件のコメント:
コメントを投稿