docker_machine

Docker ToolboxでMac OSXにDocker環境を最速で構築するでは、Docker Toolboxを利用してMacOSXにDocker環境を構築した。今回は、Docker Toolboxに含まれるDocker Machineを使って仮想環境にDockerホストを構築する。

Docker Machineとは

Docker MachineとはDocker社が提供しているツールであり、Dockerホストを様々な仮想化環境に構築する。

20151122_Docker_Machine

これを使うことで、AWSでも、VirtualBoxでも、ESXiでもDocker deamonがインストールされたVMを作成できる。(要する簡単にリモートに上図の赤枠で囲まれている部分が構築出来る)

Docker MachineがサポートするDriver

Docker Machineは様々な仮想環境サポートするDriverを提供しており、2015年11月22日現在は以下がサポートされている。

  • Amazon Web Services
  • Microsoft Azure
  • Digital Ocean
  • Exoscale
  • Google Compute Engine
  • Generic
  • Microsoft Hyper-V
  • OpenStack
  • Rackspace
  • IBM Softlayer
  • Oracle VirtualBox
  • VMware vCloud Air
  • VMware Fusion
  • VMware vSphere

今回はこの中から、Virtualbox、AWS、ESXiに絞ってDockerホストを構築してみる。

準備

前準備として、Docker Toolboxをインストールしておく。まだインストールしていない場合は、Docker ToolboxでMac OSXにDocker環境を最速で構築するを参考にインストールする。

仮想環境にDockerホストを構築する

with Virtualbox

まずはVirtualboxにDockerホストを構築する。

➤  docker-machine create --driver=virtualbox vbox-test

このコマンドを実行すると以下のようなメッセージが表示され、VirtualBox上にvbox-testという名前のDockerホスト(VM)が起動する。

Running pre-create checks...
Creating machine...
(vbox-test) OUT | Creating VirtualBox VM...
(vbox-test) OUT | Creating SSH key...
(vbox-test) OUT | Starting VirtualBox VM...
(vbox-test) OUT | Starting VM...
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...
Detecting the provisioner...
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 vbox-test

20151122_DockerホストonVirtualbox

ご覧の通りとても簡単にDockerホストが構築できる。このホストにアクセスする。

➤  docker-machine ssh vbox-test
                        ##         .
                  ## ## ##        ==
               ## ## ## ## ##    ===
           /"""""""""""""""""\___/ ===
      ~~~ {~~ ~~~~ ~~~ ~~~~ ~~~ ~ /  ===- ~~~
           \______ o           __/
             \    \         __/
              \____\_______/
 _                 _   ____     _            _
| |__   ___   ___ | |_|___ \ __| | ___   ___| | _____ _ __
| '_ \ / _ \ / _ \| __| __) / _` |/ _ \ / __| |/ / _ \ '__|
| |_) | (_) | (_) | |_ / __/ (_| | (_) | (__|   <  __/ |
|_.__/ \___/ \___/ \__|_____\__,_|\___/ \___|_|\_\___|_|
Boot2Docker version 1.9.1, build master : cef800b - Fri Nov 20 19:33:59 UTC 2015
Docker version 1.9.1, build a34a1d5

VirtualBoxに何もOSを指定しない場合は、Boot2Dockerというディストリビューションが使われる。

docker@vbox-test:~$ lsb_release -a
Boot2Docker 1.9.1 (TCL 6.4.1); master : cef800b - Fri Nov 20 19:33:59 UTC 2015
docker@vbox-test:~$ uname -a
Linux vbox-test 4.1.13-boot2docker #1 SMP Fri Nov 20 19:05:50 UTC 2015 x86_64 GNU/Linux

つづいて、他OSをベースとしたDockerホストを構築する。OSを指定したい場合は--virtualbox-boot2docker-urlオプションをつけてisoのパス明示する。今のところ、VirtualboxをDocker machineをネイティブサポートしているのはRancherOSくらいみたいなので、こいつを動かしてみる。

➤  docker-machine create -d virtualbox \
> --virtualbox-boot2docker-url https://github.com/rancherio/os/releases/download/v0.3.1/machine-rancheros.iso \
> rancheros
Running pre-create checks...
Creating machine...
(rancheros) OUT | Downloading boot2docker.iso from https://github.com/rancherio/os/releases/download/v0.3.1/machine-rancheros.iso...
(rancheros) OUT | 0%....10%....20%....30%....40%....50%....60%....70%....80%....90%....100%
(rancheros) OUT | Creating VirtualBox VM...
(rancheros) OUT | Creating SSH key...
(rancheros) OUT | Starting VirtualBox VM...
(rancheros) OUT | Starting VM...
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...
Detecting the provisioner...
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 rancheros

➤  docker-machine ls
NAME        ACTIVE   DRIVER       STATE     URL                         SWARM
rancheros   -        virtualbox   Running   tcp://192.168.99.101:2376
vbox-test   -        virtualbox   Running   tcp://192.168.99.100:2376

➤  docker-machine ssh rancheros

[docker@rancheros ~]$ uname -a
Linux rancheros 3.19.3-rancher #1 SMP Thu Apr 30 15:21:41 UTC 2015 x86_64 GNU/Linux

with AWS

続いて、公式サイトに従いAWS上にDockerホストを構築する。Docker Machine経由でAWSにDockerホストを構築するときに必要は情報は以下の3つ。

  • Access Key ID(ここを参考にする)
  • Secret Access Key(ここを参考にする)
  • VPC ID

これらが準備できればあとはVirtualboxの時と同様にdokcer-machineコマンドでDockerホストが構築できる。但し、必須の--amazonec2-access-key--amazonec2-secret-key--amazonec2-vpc-id以外にも--amazonec2-ami(ami-idはコンソールかここから取得)、--amazonec2-region-amazonec2-security-groupなどがあり、これらは指定して使うことになるだろう。AWSのDriverのオプションはここで確認すること。

早速、Dockerホストを作ってみる。

➤  docker-machine create --driver amazonec2 --amazonec2-access-key AKI****** --amazonec2-secret-key ***** --amazonec2-vpc-id vpc-*** --amazonec2-region ap-northeast-1 --amazonec2-ami ami-936d9d93 --amazonec2-security-group default aws01

数分待つとAWS上にaws01という名前のEC2インスタンスができている。docker-machineでも確認できる。

➤  docker-machine ls
NAME        ACTIVE   DRIVER       STATE     URL                         SWARM
aws01       -        amazonec2    Running   tcp://VV.XX.YYY.ZZZ:2376
rancheros   -        virtualbox   Running   tcp://192.168.99.101:2376
vbox-test   -        virtualbox   Running   tcp://192.168.99.100:2376

残す必要が無い場合はDockerホストを削除する。

➤  docker-machine rm aws01
Successfully removed aws01

AWSでもDockerホストが立てられるようだけど、そもそもAWSにはECSがあるのでそっちを使った方が良いだろうね。

with ESXi(Coming Soon)

ESXiのDriverオプションはここを確認すること。

AWSトラブルシュート

docker-machine createの途中で止まる

docker-machne create実行中にこんな風に止まることがある。

➤  docker-machine create --driver amazonec2 --amazonec2-access-key AKI****** --amazonec2-secret-key ***** --amazonec2-vpc-id vpc-*** --amazonec2-region ap-northeast-1 --amazonec2-ami ami-936d9d93 --amazonec2-security-group default aws01

Creating machine...
(aws01) OUT | Launching instance...
Waiting for machine to be running, this may take a few minutes...
Machine is running, waiting for SSH to be available...

AWSのコンソールを見るとDockerホストのインスタンスが増えているし、docker-machine lsでも成功しているように見える。

➤  docker-machine ls
NAME        ACTIVE   DRIVER       STATE     URL                         SWARM
aws01       -        amazonec2    Running   tcp://VV.XX.YYY.ZZZ:2376
rancheros   -        virtualbox   Running   tcp://192.168.99.101:2376
vbox-test   -        virtualbox   Running   tcp://192.168.99.100:2376

sshでログイン出来るか確認したところ、error code 255が帰ってきてログインできない。

➤  docker-machine ssh aws-docker-host
exit status 255

デバッグモードで確認してみるとsshが上手く行かないのが原因のようだ。


SSH cmd err, output: exit status 255:
Error getting ssh command 'exit 0' : Something went wrong running an SSH command!
command : exit 0
err     : exit status 255
output  :

Getting to WaitForSSH function...
(aws01) Calling RPCServerDriver.GetSSHHostname
(aws01) DBG | Making AWS API call with values:
(aws01) DBG | {
(aws01) DBG |     "Action": [
(aws01) DBG |         "DescribeInstances"
(aws01) DBG |     ],
(aws01) DBG |     "InstanceId.1": [
(aws01) DBG |         "i-b25bc617"
(aws01) DBG |     ],
(aws01) DBG |     "Version": [
(aws01) DBG |         "2014-06-15"
(aws01) DBG |     ]
(aws01) DBG | }
(aws01) Calling RPCServerDriver.GetSSHPort
(aws01) Calling RPCServerDriver.GetSSHKeyPath
(aws01) Calling RPCServerDriver.GetSSHUsername
Using SSH client type: external
About to run SSH command:
exit 0

この辺を見ると、EC2のインスタンス作成中に止まる問題は同様に報告されているみたい。

もう少し調べたい。

Error with pre-create check: There is already a keypair with the nameというエラーが出る

docker-machineがインスタンスの生成に失敗した時、続けて同じ名前でインスタンスを生成仕様とすると以下のエラーが出る。

# 誤ったオプションと引数により失敗
➤  docker-machine create --driver amazonec2 --amazonec2-access-key AKI****** --amazonec2-secret-key ***** --amazonec2-vpc-id vpc-*** --amazonec2-region ap-northeast-1 --amazonec2-ami ami-936d9d93 --amazonec2-security-group default aws01
Running pre-create checks...
Creating machine...
(aws01) OUT | Launching instance...
Error creating machine: Error in driver during machine creation: Error decoding error response: Error decoding error response: http: read on closed response body
➤  docker-machine create --driver amazonec2 --amazonec2-access-key AKI****** --amazonec2-secret-key ***** --amazonec2-vpc-id vpc-*** --amazonec2-region ap-northeast-1 --amazonec2-ami ami-936d9d93 --amazonec2-security-group default aws01
Host already exists: "aws01"

➤  docker-machine ls
error getting state for host aws01: Problem with AWS API call: Non-200 API response: code=400 message=The request must contain the parameter InstanceId

error getting URL for host aws01: Problem with AWS API call: Non-200 API response: code=400 message=The request must contain the parameter InstanceId

NAME              ACTIVE   DRIVER       STATE     URL                         SWARM
aws-docker-host   -        amazonec2    Error
rancheros         -        virtualbox   Running   tcp://192.168.99.101:2376
vbox-test         -        virtualbox   Running   tcp://192.168.99.100:2376

こうなるとdocker-machineコマンド削除できなくなってしまうようなので、手動で削除する。

➤  docker-machine rm -f aws01

続いて同じ名前のDockerホストを生成しようとするとエラーが出る。

➤  docker-machine create --driver amazonec2 --amazonec2-access-key AKI****** --amazonec2-secret-key ***** --amazonec2-vpc-id vpc-*** --amazonec2-region ap-northeast-1 --amazonec2-ami ami-936d9d93 --amazonec2-security-group sg-*** aws01
Running pre-create checks...
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.

これは、初回の失敗時にインスタンスの生成は失敗しているが、Key-pairは登録されてしまうためである。[amazonec2] Race causes machine to think instance doesn't exist and bail in create · Issue #606 · docker/machine · GitHubをみると、どうやら自動削除機能についてはまだ実装されていないようだ。今回のエラーはAWSのadminパネルのKey-pairから該当の物を削除すれば良い。

まとめ

Docker Machineで様々な仮想環境にDockerホストを構築した。Docker Machineのおかげで、ESXiからAWSへ環境を移動したいときでもオプションを変更する程度で同一Dockerホストが構築できるのは手間もかからないので大きいですね。

参考

公式ドキュメント

Docker Machine + Virtualbox

Docker Machine + AWS

Docker Machine + ESXi

トラブルシュート