実習で学ぶ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つに分けられる。
- Dockerホストを作る基盤となるOSイメージファイル
- Dockerホストを作成・管理するためのCLIツール
Boot2Docker概要
OSイメージファイルはTiny Core Linuxという軽量Linuxをベースにしている。Ubuntuなどの汎用サーバー用OSとは異なり、Dockerホストに必要な最小限のものだけを含むため、サイズは数十MBと非常に軽い。
CLIツールのコマンド名はinit、up、downなど直感的で分かりやすく、Linuxの知識をあまり必要としない。
このようなOSとツールをセットで提供してくれるおかげで、DockerやLinuxにあまり詳しくないユーザーでも、簡単かつ確実に軽量なDockerホストを作成できる。
Docker Machineの登場
Boot2Dockerの登場により、Dockerホストの作成は非常に簡単になった。このBoot2Dockerの後継として開発されたものがDocker Machineである。Docker Machineは2014年12月のDockerCon EUで発表された。
Docker MachineはBoot2Dockerと同様、簡単で軽量なDockerホストを作成・管理できるツールである。技術的にも次のようにBoot2Dockerの成果を継承し発展させたものとなっている。
- Dockerホストを作る基盤となるOSイメージファイルにはBoot2Dockerなどのイメージを使用できる。
- Dockerホストを作成・管理するためのCLIツールはBoot2Dockerから移行された。
- 仮想環境として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.
stop、startの代わりに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ホスト上のコマンドを実行できる。別途ログイン・ログアウトコマンドを入力する必要はない。
次の例では、devkumahostでlsコマンドを実行し、/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 stopはdefaultという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を触ってみるとよいだろう。