実習で学ぶDocker入門 | 5. Docker MachineでWindowsにDockerホストを作る

今回はDocker Machineというツールを使用し、Windows PCにDockerホストを作る方法を紹介する。Dockerホストとは、Dockerがインストールされ、使用できる状態になっている環境である。Dockerホストを作る方法については、以前「Dockerイメージコンテナ管理メカニズム」でDocker for WindowsとDocker ToolboxというGUIツールを紹介したが、今回扱うDocker MachineはCLIツールである。Docker MachineはVirtualBoxなどの仮想環境ツールがあれば、1行のコマンド実行だけでDockerホストを作成してくれる。

Dockerホストを作れない

Docker Machineを扱う前に、まずDocker Machineが登場した経緯を見てみよう。

Dockerの特徴の1つとして、アプリケーションの移植性を高めてくれる点が挙げられる。以前の記事でも、Dockerの特徴はアプリケーションをさまざまな環境へデプロイできること、そして一度アプリケーションをDockerコンテナのイメージにすれば、そのままさまざまなプラットフォームで実行できることだと説明した。

この移植性は当然、Dockerを利用できる環境、つまりDockerホストなしには成立しない。Dockerホストがあって初めて、アプリケーションに高い移植性をもたらせる。

しかしDockerホストを作成することは決して簡単ではなかった。特にDockerが登場した2013年はそうだった。Dockerホストを作成するにはOSが必要だが、どのOSを用意すればよいのか。Docker登場初期にサポートされていたOSはUbuntu 12.04/12.10だけだった。そのバージョンのUbuntu環境を用意するか、新しく作るか、既存のUbuntu以外のLinuxではパッチなどの作業が必要だった。

2013年11月にリリースされたDocker 0.7から主要なLinuxディストリビューションがすべてサポートされたが、Dockerホストを作る技術はまだそれほど発展していなかったと言える。

Boot2Dockerの登場

そのような中、2013年12月に開催されたDocker社のイベントでBoot2Dockerが発表された。

Boot2Dockerは、仮想環境ツールであるVirtualBoxにDockerホストを作るツールである。初期はMacのみ対応していたが、後にWindowsも対応するようになった。

Boot2Dockerの構成は次の2つに分けられる。

  1. Dockerホストを作る基盤となるOSイメージファイル
  2. Dockerホストを作成・管理するためのCLIツール

Boot2Docker概要

OSイメージファイルはTiny Core Linuxという軽量Linuxをベースにしている。Ubuntuなどの汎用サーバー用OSとは異なり、Dockerホストに必要な最小限のものだけを含むため、サイズは数十MBと非常に軽い。

CLIツールのコマンド名はinitupdownなど直感的で分かりやすく、Linuxの知識をあまり必要としない。

このようなOSとツールをセットで提供してくれるおかげで、DockerやLinuxにあまり詳しくないユーザーでも、簡単かつ確実に軽量なDockerホストを作成できる。

Docker Machineの登場

Boot2Dockerの登場により、Dockerホストの作成は非常に簡単になった。このBoot2Dockerの後継として開発されたものがDocker Machineである。Docker Machineは2014年12月のDockerCon EUで発表された。

Docker MachineはBoot2Dockerと同様、簡単で軽量なDockerホストを作成・管理できるツールである。技術的にも次のようにBoot2Dockerの成果を継承し発展させたものとなっている。

  1. Dockerホストを作る基盤となるOSイメージファイルにはBoot2Dockerなどのイメージを使用できる。
  2. Dockerホストを作成・管理するためのCLIツールはBoot2Dockerから移行された。
  3. 仮想環境としてVirtualBoxだけでなく、Hyper-VやAWSなどさまざまなものを利用できる。

Docker Machine概要

Boot2Dockerと最も大きく異なる点は3番の仮想環境である。Docker Machineにはドライバという仕組みがあり、VirtualBoxドライバやAWSドライバなどを切り替えることで、さまざまな仮想環境にDockerホストを作成できる。現在は10種類以上のドライバがDocker Machineにあらかじめ組み込まれている。また、ドライバは自作も可能であり、20個以上のサードパーティドライバが存在する。

Docker MachineのおかげでDockerホストの作成はさらに簡単になった。その後もDockerホストを作るための新しいツールが開発されていくが、それについては最後のまとめで説明する。

事前準備

では、ここからDocker Machineの具体的な使い方を紹介する。概要は次のとおりである。

  • 事前準備
  • Docker Machineインストール
  • Dockerホストを作る
  • Dockerホストにログインする
  • DockerホストでHello World

まず事前準備としてWindows 10にVirtualBoxをインストールする。そしてPowerShellコマンドを実行できることを確認する。

ここで筆者が利用した環境は次のとおりである。

  • Windows 10 Pro
  • VirtualBox 6.1.22
  • PowerShell 5.1.19041.1023

Windows 10

Dockerホストを作る新しいツールであるDocker for WindowsはWindows 10以上で動作するが、Docker MachineはWindows 7以上から動作する。Windows 7以下を使用している人は参考にしてほしい。

VirtualBox

VirtualBoxはDocker Machineの基本仮想環境ツールである。Windows用インストーラはVirtualBoxのサイトからダウンロードできる。Docker MachineはAWSなども使用できるが、まずはBoot2Dockerとの関連もあり、問題解決情報も豊富なVirtualBoxを使うことをおすすめする。

WindowsでHyper-Vを使用したい場合、Hyper-VとVirtualBoxを同時に使うことは技術的に不可能なので注意してほしい。

PowerShell

WindowsのCLIとしてコマンドプロンプトを思い浮かべる人も多いと思うが、ここではPowerShellを使用する。

PowerShellはWindowsに最初からインストールされているが、Windows 7の場合は古いバージョンの可能性が高い。PowerShellのバージョンはPowerShellで次のように入力すると表示される。

PS C:\> $PSVersionTable

$PSVersionTableはバージョン情報を保存する変数であり、PowerShellが自動的に作成する。

Docker Machineインストール

事前準備が完了したらDocker Machineをインストールする。インストールは簡単である。バイナリファイルをダウンロードし、Pathを設定するだけでよい。

今回使用するDocker Machineバージョンはv0.16.2である。バイナリファイルはDocker MachineのGitHubページからダウンロードできる。Windows 64ビット版のファイル名はdocker-machine-Windows-x86_64.exeである。ダウンロードしたファイル名をdocker-machine.exeへ変更し、適当な場所に保存する。ここでは次の場所にファイルがある前提で説明する。

C:\docker\docker-machine.exe

動作確認のためPowerShellを開き、次のコマンドを実行する。

PS C:\> C:\docker\docker-machine.exe version
docker-machine.exe version 0.16.2, build bd45ab13

バージョン情報が出力される。

毎回このような長いパス付きでコマンドを入力するのは不便なので、Windows環境変数PathにC:\dockerを追加する。PowerShellを再起動して次のコマンドを実行する。

PS C:\> docker-machine version
docker-machine.exe version 0.16.2, build bd45ab13
PS C:\>

情報が出力されれば成功である。先ほどとは異なり、docker-machineの末尾に.exeを付けていない。.exeがあっても動作するが、省略してもよい。

Dockerホストを作る

Docker Machineは次の1行のコマンドを実行するだけでDockerホストを作ってくれる。

PS > docker-machine create --driver virtualbox devkumahost

注意: 既にHyper-Vがインストールされている場合、docker-machine createコマンドを実行すると、Hyper-Vが有効なためVirtualBoxで64ビットVMを起動できないというエラーが発生することがある。前述のとおりHyper-VとVirtualBoxを同時に使うことは技術的に不可能なので、どちらか一方を使わないようにする必要がある。ここではVirtualBoxを使うためHyper-V機能を無効にする。

createはDockerホストを作成するコマンドで、devkumahostはDockerホスト名である。--driver(または-d)はドライバを指定するオプションで、ここではVirtualBoxドライバを指定している。VirtualBoxドライバはデフォルトドライバなので、--driverは省略できる。

PS > docker-machine create devkumahost

実行するとBoot2Dockerイメージのダウンロード、VirtualBox VMの作成、SSHキー作成、VM起動、証明書コピー、Docker設定、接続確認などのログが出力される。

Docker is up and running!

DockerホストでDockerが動作している。

本当にDockerホストが作成されたか確認する。

PS C:\> docker-machine ls
NAME          ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER      ERRORS
devkumahost   -        virtualbox   Running   tcp://192.168.99.100:2376           v19.03.12

lsコマンドはDockerホスト一覧を出力するコマンドである。devkumahostというDockerホストが作成され、状態がRunningであることを確認できる。

Dockerホストにログイン

次に作成したDockerホストにログインしてみる。

ログインはSSHで行う。SSHの設定は既に自動で完了しているため、Docker Machineのsshコマンドにホスト名を指定すればログインできる。

PS C:\> docker-machine ssh devkumahost
   ( '>')
  /) TC (\   Core is distributed with ABSOLUTELY NO WARRANTY.
 (/-_--_-\)           www.tinycorelinux.net

docker@devkumahost:~$

このようにDocker MachineでDockerホストを作成すると、SSHについてほとんど気にする必要がない。

DockerホストでHello World

Dockerホストにログインできたので、次にDockerの動作を確認してみる。

Dockerは既にDockerホストにインストールされ、すぐ動作する状態である。Dockerホストにログインした状態で、次のようにhello-worldコンテナを作成して起動する。

docker@devkumahost:~$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
b8dfde127a29: Pull complete

Hello from Docker!
This message shows that your installation appears to be working correctly.

途中にHello from Docker!と表示された。

これでcreateコマンドでDockerホストを作り、SSHでログインしてDockerを使えるようになった。

Dockerホストの起動・停止

まずLinuxのexitコマンドを実行し、Dockerホストからログアウトする。

docker@devkumahost:~$ exit
logout
PS C:\>

ログアウトしてもDockerホストは起動している。statusコマンドで状態を確認する。

PS C:\> docker-machine status devkumahost
Running

stopコマンドで停止する。

PS C:\> docker-machine stop devkumahost
Stopping "devkumahost"...
Machine "devkumahost" was stopped.

startコマンドで再度開始する。

PS C:\> docker-machine start devkumahost
Starting "devkumahost"...
Machine "devkumahost" was started.
Waiting for SSH to be available...
Detecting the provisioner...
Started machines may have new IP addresses. You may need to re-run the `docker-machine env` command.

stopstartの代わりにrestartコマンドを実行すると、停止後に再起動する。

Dockerホスト削除

不要になったDockerホストはrmコマンドで削除できる。

PS C:\> docker-machine rm devkumahost
About to remove devkumahost
WARNING: This action will delete both local reference and remote instance.
Are you sure? (y/n): y
Successfully removed devkumahost

削除されたか確認するには、lsコマンドでDockerホスト一覧を確認すればよい。

Dockerホストの設定情報

inspectコマンドを実行すると、Dockerホストの設定情報をJSON形式で出力できる。

PS C:\> docker-machine inspect devkumahost
{
    "ConfigVersion": 3,
    "Driver": {
        "IPAddress": "192.168.99.102",
        "MachineName": "devkumahost",
        "SSHUser": "docker",
        "SSHPort": 2644,
        (以下省略)         

また、次のフォルダに設定ファイルが保存されており、テキストエディタなどで開いて確認できる。

<ユーザーホームディレクトリ>\.docker\machine\machines\<ホスト名>\config.json

Boot2Dockerバージョンを指定

Docker Machineは特に何も指定しなければ、最新のBoot2Dockerイメージファイルをダウンロードして使用する。

特定バージョンのBoot2Dockerを利用したい場合は、--virtualbox-boot2docker-urlにイメージファイルのURLを指定する。

PS C:\> docker-machine create --virtualbox-boot2docker-url https://github.com/boot2docker/boot2docker/releases/download/v19.03.12-ce/boot2docker.isl devkumahost1903

原文ではここでエラーが発生しており、後で調べることにしている。

Dockerホストコマンドの実行

sshコマンドは引数でDockerホスト上のコマンドを実行できる。別途ログイン・ログアウトコマンドを入力する必要はない。

次の例では、devkumahostlsコマンドを実行し、/homeディレクトリの内容を表示している。

PS C:\> docker-machine ssh devkumahost ls /home
docker
dockremap
PS C:\>

Dockerホストにプロキシ情報を設定

hello-worldを実行すると次のようなエラーが出ることがある。

docker@devkumahost:~$ docker run hello-world
Unable to find image 'hello-world:latest' locally
docker: Error response from daemon: Get https://registry-1.docker.io/v2/: dial tcp: lookup registry-1.docker.io on 10.0.2.3:53: no such host.
See 'docker run --help'.

原因の1つとして、会社や学校のHTTPプロキシを通過できないことが考えられる。この場合、Dockerホストにプロキシ情報を設定する。

プロキシ情報はcreateコマンドのオプションで設定できる。

PS> $http_proxy = 'https://myproxy.com:1234'
PS> $https_proxy = 'https://myproxy.com:1234'
PS> docker-machine create --engine-env HTTP_PROXY=$http_proxy --engine-env HTTPS_PROXY=$https_proxy myhost

ユーザー名とパスワードが必要な場合は次のように設定する。

PS> $http_proxy = 'https://user:password@myproxy.com:1234'
PS> $https_proxy = 'https://user:password@myproxy.com:1234'
PS> docker-machine create --engine-env HTTP_PROXY=$http_proxy --engine-env HTTPS_PROXY=$https_proxy myhost

このユーザー名とパスワードはinspectコマンドで平文として見えてしまうため注意が必要である。またDocker Machine設定ファイル(config.json)にも平文で保存される。

基本ホスト名 “default”

Dockerホストの名前をdefaultに設定しておくと便利である。一部のコマンドではホスト名を省略できるためである。

たとえばdocker-machine startのようにホスト名を指定せずにstartコマンドを実行すると、defaultというDockerホストを起動する。同様にdocker-machine stopdefaultというDockerホストを停止する。

ヘルプ

以上で紹介したもの以外にも、Docker Machineはさまざまなコマンドとオプションを提供する。次のコマンドでヘルプが表示されるので、いろいろ練習してみるとよい。

PS C:\> docker-machine
Usage: docker-machine.exe [OPTIONS] COMMAND [arg...]

結論: Docker Machineと関連ツール

本記事ではDocker Machineを使用してWindowsにDockerホストを作る方法を紹介した。

Docker Machine以外にもDocker社はさまざまなツールを開発している。次に、そのツール群の中でDocker Machineがどのような位置づけにあるかを見ながらまとめる。

Docker Machine関連ツールと発表年は次のとおりである。

  • Boot2Docker (2013)
  • Docker Compose (Fig) (2014)
  • Kitematic (2014)
  • Docker Machine (2014)
  • Docker Toolbox (2015)
  • Docker for Windows (2016)
  • InfraKit (2016)
  • LinuxKit (2017)

Dockerが発表されたのは2013年3月である。その後まもなくDocker社外でさまざまなツールが開発され、Docker社はそれらを積極的に自社へ取り込んだ。

Docker Composeは元々Figという名前で英国のスタートアップが開発したツールだったが、すぐDocker社に買収された。KitematicはGUIでDockerを操作するツールであり、2015年にDocker社へ買収された。

2014年12月のDockerCon EUでDocker Machineが発表された。Docker MachineはBoot2Dockerの成果を発展させたツールである。

Docker ToolboxはWindowsとMacでもDockerを簡単に使えるようにするツールであり、Docker Compose、Kitematic、Docker Machineなどを1つのパッケージにしたものだった。

その後Docker for Windowsは、Dockerホスト作成方法として基本的にDocker Machineを使用しなくなった。Docker Machineはクラスタ環境を作る場合など必要なときに使うツールとして評価され、仮想環境ツールもVirtualBoxではなくHyper-Vを採用している。

InfraKitとLinuxKitはDockerホストの作成・管理やイメージファイル作成のためのツールである。Docker社としては今後InfraKitとLinuxKitに注力し、Docker Machineは維持するが新機能は追加しない方針であると見られる。

筆者個人としては、Dockerにまだ慣れていない人はまずDocker Machineを利用するのがよいと思う。Docker for WindowsのようなGUIツールは便利だが、内部構造が見えにくい。Docker Machineを使った経験があれば、Docker for Windowsが何をしてくれるツールなのか理解しやすく、Dockerを扱えるようになるのも早い。

本記事で紹介したように、Docker Machineは手軽に使えるツールである。Dockerを効率的に理解し、扱えるようになるためにもDocker Machineを触ってみるとよいだろう。