非Linux環境でもDockerの実行環境を簡単に構築できる「Docker Machine」

近年普及が進んでいるコンテナ技術「Docker」。しかしDockerはLinux固有の技術を利用しているため、Mac OS XやWindowsといった環境ではそのままでは利用できない。今回紹介する「Docker Machine」は、このような非Linux環境でDockerを利用するための支援ツールだ。

Dockerの実行環境を簡単に構築できる「Docker Machine」

Linux向けのコンテナ技術「Docker」は、仮想マシンなどを利用するよりも少ないオーバーヘッドで隔離されたコンテナ環境を作成できるのが特徴だ。そのため近年では急激に利用者が増加している。いっぽうで運用環境にはLinuxを使っていても、開発環境としてはWindowsやMac OS Xを使っているというケースも少なくない。そういった環境でDockerを利用したい場合、Linuxマシンにリモートログインして操作するか、もしくは仮想化ソフトウェアを使ってLinux環境を用意するケースが多かった。その場合、サーバーや仮想マシンにLinuxをインストールし、さらにDockerなどの設定を行う必要となる。このインストールや設定作業を自動化する仕組みが、今回紹介する「Docker Machine」だ。

Docker Machineのアーキテクチャ

Docker Machineはその本体である「docker-machine」コマンドと、「ドライバ」と呼ばれるプラグインから構成されている(図1)。

図1 Docker Machineのアーキテクチャ
図1 Docker Machineのアーキテクチャ

Docker Machineでは、docker-machineコマンドを使ってDockerを実行させるサーバーや仮想マシンといったホスト(Dockerホスト)の管理を行える。具体的には、仮想マシンやサーバーインスタンスの作成・削除および起動・停止、OSやDockerといった必要なソフトウェアのインストールといった作業が可能だ。

Docker MachineではDockerホストと通信を行う部分をドライバとして本体から分離することで、さまざまなクラウドサービスや仮想化ソフトウェアに対応できるようになっている。Docker Machineにデフォルトで付属するドライバは次の14個だ。

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やVMware、Hyper-Vといった主要な仮想化ソフトウェアや、Amazon Web Services(AWS)、Microsoft Azure、Google Compute Engine(GCE)といった主要なクラウドサービスは標準でサポートされている。また、「Generic」ドライバはSSHでリモートログインできるLinuxサーバーをDockerホストとして使用するものだ。これにより、専用サーバーやVPSなどをDockerホストとして利用することが可能になる。

これ以外にサードパーティによって開発されているドライバもあり、それらをインストールすることで上記14種以外の仮想化ソフトウェアやクラウドサービスにも対応できるようになっている。たとえば後述する「sakuracloud」ドライバを導入すれば、さくらのクラウドをDockerホストとして利用できるようになる。

また、docker-machineコマンドではDocker向けのオプション設定や環境変数設定を出力する機能も用意されている。これを利用してDockerクライアント(dockerコマンド)を設定することで、ローカルで稼動しているDockerを利用するのとまったく同じ感覚で仮想マシンやクラウド、リモートサーバーなどのDockerホスト上で稼動しているDockerを操作できるようになる。

Docker Machineのインストール

Docker MachineはDockerと同様にオープンソースで開発されており、ソースコードはGitHubで公開されている。ただし、コンパイル型の言語であるGo言語で実装されているため、利用するためにはソースコードのコンパイルが必要だ。GitHub上のリリースページではソースコードだけでなくLinuxやMac OS X、Windows向けのコンパイル済みバイナリも提供されているので、通常はこちらを利用すると良いだろう。ここで配布されているのはインストーラではなく実行ファイル本体そのものなので、ダウンロード後に手動で適当なディレクトリに「docker-machine」というファイル名でコピーし、パーミッション設定などを行う必要がある。

また、Docker MachineにはDocker(Dockerクライアント)は含まれていないため、こちらも別途インストールしておく必要がある。Dockerのバイナリも同じくGitHub上のリリースページから入手が可能だ。

なお、DockerやDocker Machine、VirtualBoxなどをまとめてインストールできるWindowsおよびMac OS X向けインストーラ「Docker Toolbox」も提供されている。このインストーラではDockerクライアントおよびDocker Machine、コンテナ管理ツール「Docker Compose」、GUIフロントエンド「Kitematic」、Git(Git for Windows)、VirtualBoxをまとめてインストールできる。ややファイルサイズが大きいためダウンロードには時間がかかるが、DockerやVirtualBoxが導入されていない環境でDocker Machineをインストールしたい場合はこちらが便利だろう(図2、3)。

図2 Docker関連ツールをまとめてインストールできる「Docker Toolbox」
図2 Docker関連ツールをまとめてインストールできる「Docker Toolbox」
図3 Docker ToolboxではVirtualBoxやGit for Windowsもまとめてインストールできる
図3 Docker ToolboxではVirtualBoxやGit for Windowsもまとめてインストールできる

Docker Machineを使ってローカルのVirtualBox上にDockerホストを構築する

DockerおよびDocker Machine、VirtualBoxが適切にインストールされていれば、次のようにdocker-machineコマンドを実行するだけでDockerがインストールされた仮想マシンの作成と起動を行える。

docker-machine create --driver virtualbox <Dockerホスト名>

たとえば「vbox」という名前のDockerホストを作成する場合、次のようになる。

$ docker-machine create --driver virtualbox vbox
Creating CA: /Users/hylom/.docker/machine/certs/ca.pem
Creating client certificate: /Users/hylom/.docker/machine/certs/cert.pem
Running pre-create checks...
Creating machine...
(vbox) Image cache does not exist, creating it at /Users/hylom/.docker/machine/cache...
(vbox) No default boot2docker iso found locally, downloading the latest release...
(vbox) Latest release for github.com/boot2docker/boot2docker is v1.9.1
(vbox) Downloading https://github.com/boot2docker/boot2docker/releases/download/v1.9.1/boot2docker.iso to /Users/hylom/.docker/machine/cache/boot2docker.iso...
(vbox) 0%....10%....20%....30%....40%....50%....60%....70%....80%....90%....100%
(vbox) Creating VirtualBox VM...
(vbox) Creating SSH key...
(vbox) 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 with boot2docker...
Copying certs to the local machine directory...
Copying certs to the remote machine...
Setting Docker configuration on the remote daemon...
Checking connection to Docker...
Docker is up and running!
To see how to connect Docker to this machine, run: docker-machine env vbox

このときVirtualBoxはバックグラウンドで稼動し、GUIの管理画面は表示されない。Dockerホストの稼働状況を確認するには、「docker-machine ls」コマンドを使用する。

$ docker-machine ls
NAME      ACTIVE   DRIVER       STATE     URL                         SWARM   ERRORS
vbox   -        virtualbox   Running   tcp://192.168.99.100:2376

また、Dockerホストを停止させるには「docker-machine stop <Dockerホスト名>」コマンドを、削除するには「docker-machine rm <Dockerホスト名>」コマンドを実行すれば良い。

$ docker-machine stop vbox
(vbox) Stopping VM...
$ docker-machine rm vbox
(vbox) Stopping VM...
Successfully removed vbox

なお、docker-machineコマンドを引数無しで実行すると、利用できるサブコマンドやオプションなどの一覧を確認できる。

Dockerホスト上のDockerを操作する

Dockerクライアントには別ホスト上で稼動しているDockerにネットワーク経由でアクセスして各種操作を行う機能が用意されており、これを利用することでDockerホスト上のDockerをあたかもローカルで稼動しているかのように操作できる。この機能を利用するには、「DOCKER_HOST」や「DOCKER_MACHINE_NAME」、「DOCKER_CERT_PATH」、「DOCKER_TLS_VERIFY」といった環境変数を設定するか、もしくはdockerコマンドの引数でこれらに対応する「-H」オプションや「--tlscert」オプションなどの値を指定すれば良い。

Docker Machineではこの設定を簡便にするため、「env」や「config」といったサブコマンドが用意されている。たとえば「docker-machine env <Dockerホスト名>」コマンドを実行すると、次のようにそのDockerホスト名に対応する設定スクリプトが出力される。

$ docker-machine env vbox
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.100:2376"
export DOCKER_CERT_PATH="/Users/hylom/.docker/machine/machines/vbox"
export DOCKER_MACHINE_NAME="vbox"
# Run this command to configure your shell: 
# eval "$(docker-machine env vbox)"

ここで表示されているように、docker-machineコマンドを「$(docker-machine env <Dockerホスト名>)」のように実行することで自動的に環境変数を設定できる仕組みだ。

また、configサブコマンドではdockerコマンドに与える引数の形で設定パラメータが出力される。

$ docker-machine config vbox
--tlsverify --tlscacert="/Users/hylom/.docker/machine/certs/ca.pem" --tlscert="/Users/hylom/.docker/machin
e/certs/cert.pem" --tlskey="/Users/hylom/.docker/machine/certs/key.pem" -H=tcp://192.168.99.100:2376

こちらを利用する場合、次のようにdockerコマンドの引数としてdocker-machineコマンドを指定すれば良いが、やや冗長になるので特に理由が無い限りは環境変数を利用するほうがよいだろう。

$ docker $(docker-machine config vbox)

上記の環境変数を設定したあとは、ローカルの環境でDockerを利用するのと同じようにdockerコマンドでコンテナの作成や各種管理が行える。

リモートにあるLinuxマシンをDockerホストとして使用する

Docker Machineに標準で含まれている「Generic」ドライバを利用することで、リモートにあるLinuxマシンをDockerホストとして利用することが可能だ。ただし、Dockerホストとして利用するLinuxマシンではDocker MachineがサポートするOSが稼動している必要がある(表1)。

表1 Docker MachineがサポートするOS
OS バージョン 備考
Boot2Docker 1.5以上 VirtualBoxでのデフォルト
Ubuntu 12.04以上  
RancherOS 0.3以上  
Debian 8.0以上 実験的サポート
RedHat Enterprise Linux 7.0以上 実験的サポート
CentOS 7以上 実験的サポート
Fedora 21以上 実験的サポート

また、Docker MachineではDockerホストとなるサーバーにSSHでログインし、sudoコマンドを使ってroot権限で各種処理を実行する。そのため、Dockerホストとして使用するサーバーではSSHでのログインに使用するユーザーがパスワードなしでsudoコマンドを実行できるように設定しておこう。

genericドライバによるDockerホストの作成

Dockerホストとして使用するLinuxサーバーを用意したら、次のように「generic」ドライバを指定して「docker-machine create」コマンドを実行することで、そのホストをDockerホストとして利用するための各種設定が自動で行われる。

docker-machine create --driver generic --generic-ip-address <対象とするホストのIPアドレス> --generic-ssh-user <ログインに使用するユーザー> <ホスト名>

次の例はホストのIPアドレスとして「192.168.1.10」、ログインに使用するユーザー名として「hylom」、ホスト名として「sakuravps」を指定した場合の例だ。

$ docker-machine create --driver generic --generic-ip-address 192.168.1.10 --generic-ssh-user hylom sakuravps
Running pre-create checks...
Creating machine...
(sakuravps) Importing SSH key...
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 with ubuntu(upstart)...
Installing Docker...
Copying certs to the local machine directory...
Copying certs to the remote machine...
Setting Docker configuration on the remote daemon...
Checking connection to Docker...
Docker is up and running!
To see how to connect Docker to this machine, run: docker-machine env sakuravps

これにより、自動的にDockerなど必要となるソフトウェアがインストールされ、リモートからdockerコマンドでそのホスト上のDockerを操作できるようになる。このとき、hostnameコマンドや/etc/hostnameファイルの書き換えなどが実行され、ホスト名が指定したものに変更される。

なお、Mac OS X環境ではOSが提供するキーチェーン機構によりパスフレーズの入力がバイパスされるが、Windows環境では複数回に渡って繰り返しパスフレーズの入力が求められるので注意したい。

以上の手順でDockerホストを作成後、前述の「docker-machine env」コマンドなどを使って環境変数の設定を行えば、リモートホスト上のDockerをあたかもローカルホスト上にあるDockerのように操作できるようになる。

$ eval "$(docker-machine env vbox)"
$ docker-machine ls

「sakuracloud」ドライバを利用してさくらのクラウドをDockerホストとして使用する

Docker Machineでは環境に応じたドライバを用意することで、標準でサポートされている以外の環境をDockerホストとして利用できる。GitHub上のDocker Machineリポジトリ上で利用できるドライバの一覧が公開されているが、今回はこのうちさくらのクラウド向けドライバ「sakuracloud」の利用例を紹介する。

sakuracloudドライバはKazumichi Yamamoto氏によって開発されたドライバで、GitHub上のdocker-machine-sakuracloudリポジトリでソースコードおよびバイナリが公開されている。Docker MachineのドライバはDockerやDocker Machineと同様Go言語で記述されているので、特に理由がなければリリースページで公開されているバイナリを利用するのが良いだろう。配布されているZIPファイルにはバイナリファイル(Windowsの場合.exeファイル)が含まれているので、これをDocker Machineのインストールディレクトリ(Docker Toolboxを利用してインストールした場合はWindowsの場合C:\Program Files\Docker Toolbox\ディレクトリ、Mac OS Xの場合は/usr/local/bin/ディレクトリ)にコピーすれば良い。

また、sakuracloudドライバではさくらのクラウドのAPIを利用している。このAPIを利用するには、事前にアクセストークンおよびアクセストークンシークレットの取得が必要だ。取得方法についてはさくらのクラウドAPIを使ってみよう(1)——コマンドラインツール「sacloud」から使う記事で紹介しているので、詳しくはこちらを参照して欲しい。

さて、sakuracloudドライバを使ってさくらのクラウドを利用してDockerホストを作成するには、次のようにアクセストークンやアクセストークンシークレットを指定して「docker-machine create」コマンドを実行する。

docker-machine create --driver sakuracloud --sakuracloud-access-token <アクセストークン> --sakuracloud-access-token-secret <アクセストークンシークレット> --sakuracloud-region <ホスト名>

なお、デフォルトでは石狩第1ゾーンにホストが作成されるが、これ以外のゾーンを利用したい場合は「--sakuracloud-region」オプションで使用するリージョンを指定できる。また、作成する仮想マシンのスペックをオプションで指定することも可能だ。sakuracloud固有のオプションについてはリポジトリ上にあるREADME.mdファイルで確認できる。

アクセストークンなどを適切に指定して「docker-machine create」コマンドを実行すると、次のようにクラウド上にサーバーインスタンスが作成され、Dockerなど必要なソフトウェアのインストールが自動的に行われる。

$ docker-machine create --driver sakuracloud --sakuracloud-access-token <アクセストークン> --sakuracloud-access-token-secret <アクセストークンシークレット> sakuracloud
Running pre-create checks...
Creating machine...
(sakuracloud) Build host spec &sakuracloud.Server{Name:"sakuracloud", Description:"", ServerPlan:sakuracloud.Resource{ID
:"1001"}, Tags:[]string(nil), ConnectedSwitches:[]map[string]string{map[string]string{"Scope":"shared"}}}
(sakuracloud) Creating SSH key...
(sakuracloud) password is not set, generated password:xlzvnqsc1fwl
(sakuracloud) Created Server ID: 112701066850
(sakuracloud) Build disk spec &sakuracloud.Disk{Name:"disk001", Plan:sakuracloud.Resource{ID:"4"}, SizeMB:20480, Connect
ion:"virtio", SourceArchive:sakuracloud.Resource{ID:"112700954421"}}
(sakuracloud) Created Disk ID: 112701066853
(sakuracloud) Waiting for disk to become available
(sakuracloud) Build disk edit spec &sakuracloud.DiskEditValue{Password:"************", SSHKey:sakuracloud.SSHKey{PublicKey:"ssh-rsa *******************"}, Notes:[]sakuracloud.Resource{sakuracloud.Resource{ID:"112701066852"}}}
(sakuracloud) Editted Disk Id: 112701066853
(sakuracloud) Waiting for disk to become available
(sakuracloud) Waiting for server to become Running
(sakuracloud) Waiting for server to become Stopped
(sakuracloud) Waiting for server to become Running
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 with ubuntu(upstart)...
Installing Docker...
Copying certs to the local machine directory...
Copying certs to the remote machine...
Setting Docker configuration on the remote daemon...
Checking connection to Docker...
Docker is up and running!
To see how to connect Docker to this machine, run: docker-machine env sakuracloud

サーバーインスタンスの作成が完了すると、「docker-machine ls」コマンドでその状態を確認できる。

$ docker-machine ls
NAME          ACTIVE   DRIVER        STATE     URL                         SWARM   ERRORS
sakuracloud   -        sakuracloud   Running   tcp://***.***.**.***:2376

あとはVirtualBoxやgenericドライバを利用する場合と同様に環境変数の設定などを行えば、さくらのクラウドで作成したホスト上のDockerでコンテナの実行などを行えるようになる。

また、作業が終了してDockerホストが不要になった場合、docker-machine rmコマンドでそのホストを削除すればさくらのクラウド上のサーバーインスタンスも削除される。

$ docker-machine rm sakuracloud
(sakuracloud) Stopping VM...
Successfully removed sakuracloud

GUIでDocker Machineを利用できる「Kitematics」

最後に、WindowsおよびMac OS Xで利用できるDocker MachineおよびDockerのGUIクライアント「Kitematics」についても紹介しておこう。

Kitematicsは、GUIでDocker MachineおよびDockerの操作を行えるツールだ。現時点ではDockerホストとしてローカルで実行されているVirtualBox仮想マシンのみが利用できるが、簡単な操作でDockerホストの作成やコンテナのデプロイ、実行といった操作を行える(図4)。

図4 GUIでDockerやDocker Machineを操作できる「Kitematics」
図4 GUIでDockerやDocker Machineを操作できる「Kitematics」

KitematicsはDockerコンテナのホスティングサイトDockerHubと連動するようになっており、起動時にはDockerHubへのログインが求められる。これにより自作したコンテナの利用などが容易になる仕組みだが、公開されているコンテナを利用するだけであればログインは不要だ。

Kitematicsを起動すると、DockerHub上で公開されているコンテナが表示され、ここから作成するコンテナを選択できる。コンテナを選択して「CREATE」ボタンをクリックすると、DockerHubからそのコンテナがダウンロードされ、Dockerホスト上へのデプロイが行われる(図5)。

図5 選択したコンテナを1クリックでダウンロードしてデプロイできる
図5 選択したコンテナを1クリックでダウンロードしてデプロイできる

コンテナが起動すると、画面上にそのログが表示される(図6)。また、画面右側にはコンテナにアクセスするためのポート情報が表示される。たとえばこの例の場合、「192.168.99.100」というIPアドレスの32771版ポートがコンテナの3306番ポートに対応する。

図6 コンテナが起動するとログが画面上に表示される
図6 コンテナが起動するとログが画面上に表示される

さらに、ツールバーでは停止や再起動などの操作が行えるほか、「EXEC」ボタンをクリックするとコンテナにSSHログインした状態でコンソールが起動する(図7)。

図7 「EXEC」ボタンをクリックするとコンテナ内のシェルにアクセスできる
図7 「EXEC」ボタンをクリックするとコンテナ内のシェルにアクセスできる

コンテナによっては利用する際に環境変数やポートの設定が必要な場合がある。これらは「Settings」タブで設定できる(図8)。

図8 「Settings」タブで各種設定が行える
図8 「Settings」タブで各種設定が行える

なお、Kitematicsでは起動時に自動的にDockerホストとなる仮想マシンを起動するが、Kitematicsを終了してもその仮想マシンは終了されない。この仮想マシンには「default」という名前が付けられているので、Dockerホストを停止/削除させたい場合はこれを手動で停止/削除する必要がある。

$ docker-machine ls
NAME      ACTIVE   DRIVER       STATE     URL                         SWARM   ERRORS
default   -        virtualbox   Running   tcp://192.168.99.100:2376
$ docker-machine rm default
(default) Stopping VM...
Successfully removed default

MacやWindowsを使って開発している環境でも手軽にLinux環境を利用可能に

昨今ではサービスを運用するマシンがLinuxでも、開発にはWindowsやMacマシンを利用する例が少なくない。そのような場合、テスト環境に別途Linuxマシンを用意する必要があった。しかしDocker Machineを利用することで、容易にテスト環境を仮想マシン上に構築できる。また、DockerHub上にはあらかじめ主要なソフトウェアがインストールされているコンテナが用意されているため、これらを活用することでテスト環境を含むコンテナを迅速に用意できる。

ローカルの仮想マシン上だけでなく、クラウドやリモートサーバー上にDocker環境を構築できるのも便利だ。これにより、マシンパワーの少ないPCやMacでもDockerを気軽に利用できるようになる。Dockerの入門としても使いやすい。

開発やデプロイにDockerを利用していないという場合でも、開発環境構築ツールとしてもDocker Machineは非常に有用だ。今までDockerを使っていなかったWindowsやMac OS Xユーザーも、ぜひ試してみてはいかがだろうか。