Docker Machineを使ってVirtualbox, AWS, ESXiにDockerホストを構築する
Docker ToolboxでMac OSXにDocker環境を最速で構築するでは、Docker Toolboxを利用してMacOSXにDocker環境を構築した。今回は、Docker Toolboxに含まれるDocker Machineを使って仮想環境にDockerホストを構築する。
Docker Machineとは
Docker MachineとはDocker社が提供しているツールであり、Dockerホストを様々な仮想化環境に構築する。
これを使うことで、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
ご覧の通りとても簡単に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つ。
これらが準備できればあとは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のインスタンス作成中に止まる問題は同様に報告されているみたい。
- docker-machine create is hanging with driver virtualbox : SSH cmd err, output: exit status 255: · Issue #1591 · docker/machine · GitHub
- Docker-Machine failed to provision on AWS using defaults · Issue #964 · docker/machine · GitHub
- [amazonec2] Machine cannot access created instance by SSH properly · Issue #2317 · docker/machine · GitHub
もう少し調べたい。
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ホストが構築できるのは手間もかからないので大きいですね。
参考
公式ドキュメント
- Overview of Docker Machine
- Driver options and operating system defaults
- Docker Machine 0.3.0 Deep Dive | Docker Blog
Docker Machine + Virtualbox
- Oracle VirtualBox
- Docker Machine を使って VirtualBox に Dockerホストを立てる - Qiita
- Vagrant+Docker Machine Generic Driverを使ってDockerホスト・Swarmクラスタを構築する - Qiita
Docker Machine + AWS
- Amazon Web Services
- Docker Machine Provisioning on AWS
- t2.microのubuntu14.04.2をdocker-machineで立ち上げる - Qiita
- vpc - Docker Machine を使って EC2 に Dockerホストを立てる - Qiita