プログラマのためのDocker教科書 (第1版) という本を読んだのですが、122 ページにあった以下の言葉で、理解し辛かったモヤモヤが晴れた気がします。
Docker はクライアント/サーバーアーキテクチャーを採用しており、DockerクライアントとDockerサーバーがRemote API経由で接続されています。そのため、docker ps などのコマンドはすべてサーバに送られて処理されます。
実際に確認してみます!
Windows 環境における Docker
Windows 10 Pro を所有する者は幸いである、Docker for Windows を使えるから。
僕は自宅は Windows 10 Home、職場は Windows 7 Pro というイマイチな環境なので、どちらも Docker Toolbox しか使えないんですよね。悲しいです。
というわけで、Docker Toolbox 環境におけるDocker のクライアント・サーバー環境について確認していきましょう。
Docker Toolbox のインストール
Docker Toolbox をインストールすると、以下が導入される模様。
- Docker Machine を管理する
docker-machineコマンド - Docker Engine を管理する
dockerコマンド - Docker Compose を管理する
docker-composeコマンド - Docker GUI の Kitematic (α版)
- bash 環境 (Git for Windows)
- Oracle VirtualBox
また以下の環境変数がセットされました。
DOCKER_CERT_PATH=C:\Users\z\.docker\machine\machines\default
DOCKER_HOST=tcp://192.168.99.100:2376
DOCKER_MACHINE_NAME=default
DOCKER_TLS_VERIFY=1
DOCKER_TOOLBOX_INSTALL_PATH=C:\local\dev\Docker Toolbox
Docker クライアント
Docker は以下のショートカット・アイコンで開始します。

このショートカットに設定されている実行コマンドはこちら。bash で start.sh というシェルスクリプトを実行しています。
C:\local\dev\Git\bin\bash.exe --login -i "C:\local\dev\Docker Toolbox\start.sh"
さて、ショートカットから起動してみましょう。最初の起動にはわりと時間がかかると思いますので、待ちましょう。
起動した Docker 環境がこちら。単なる bash 環境に、Docker の welcome メッセージが表示されているように見えますね。

そう、それで正解。これは docker 用にパスなど環境変数を事前にセットされた、単なる MinGW 上の bash 環境なのです。システム階層を簡単に表現すると、こんな感じ。
| bash.exe |
|---|
| MSYS/Mingw-w64 |
| Windows 10 Home |
ただし、先ほどの start.sh というシェルスクリプトには docker-machine コマンドが含まれており、裏でこっそり Docker サーバーを起動しています。最初の起動に時間がかかるのは、裏でサーバーが起動するのを待っているため。
Docker サーバー
さて、裏でこっそり起動される Docker サーバーについて確認しましょう。Oracle VM VirtualBox アイコンで VirtualBox を起動します。

すると Docker Toolbox インストール時に default という仮想マシンが作成されていることがわかります。これが Docker のサーバー側を担います。

ちなみにこの仮想マシンの設定を変えれば、Docker 実行環境のスペックが変わりますね。例えば上記ではメモリ量が1024MB=1GBですが、これを変更すればメモリ量を増加できたり。ストレージの容量を変更したり、ストレージを追加したり。
気になったポイントとしては、ユーザーフォルダを共有していること。

このフォルダ配下には個人的なファイルや、設定ファイルがいろいろ入っていて、セキュリティ的にちょっと不安ですが大丈夫でしょうか… 個人写真を勝手にネットに上げちゃう悪意ある Docker イメージなんて出回っていないですよね。って心配性な自分ですw
まあ、それはさておき。
Linux起動用に boot2docker.iso のディスクイメージと、ストレージ用に disk.vmdk ディスクファイルが設定されていますね。以下のファイルのようです。

さて、裏でこっそり起動している Docker サーバーとやらを、見てみましょう。といっても簡単、VirtualBox から該当イメージを「通常起動」するだけ。

ほら、仮想マシン上で boot2docker 環境、つまり Docker 用の Linux 環境が普通に起動してくれます。

システム階層を簡単に表現すると、こんな感じ?
| bash |
|---|
| Docker デーモン |
| boot2docker ディストリビューション |
| Linux OS |
| Oracle VM VirtualBox |
| Windows 10 Home |
まあ、普通はクライアント側で docker-machine ssh default で接続して使えばいいので、わざわざ仮想マシン側を表に出して起動する意味はありませんが。

ちょっとした遊び
docker-machine コマンドか、VirtualBox のほうで default 仮想マシンを終了しておきます。ここで Docker クライアントを起動すると、起動に時間がかかるわけなのですが…
VirtualBox のほうも起動しておくと、裏でサーバーとなる仮想マシン default がこっそり起動していて、それをクライアントが待っている様子がよくわかります。一度、並べて見てみてくださいw

というわけで
Docker Toolbox をインストールして起動してみた、だけのネタだったりします。
ただ自分としては Docker がクラサバ環境で動いている、という情報が新鮮だったので、それを実際に試してみた、のでわりと面白かったです。
さーて、本は読んだし、モヤモヤも晴れたし、これから Docker について何か試してみますかね。
ではでは!