Docker Toolbox がクラサバ環境で稼働している様子を観察してみた

[プログラマのためのDocker教科書 (第1版)](https://www.amazon.co.jp/dp/B017UGA7NG/) という本を読んだのですが、122 ページにあった以下の言葉で、理解し辛かったモヤモヤが晴れた気がします。

> Docker はクライアント/サーバーアーキテクチャーを採用しており、DockerクライアントとDockerサーバーがRemote API経由で接続されています。そのため、docker ps などのコマンドはすべてサーバに送られて処理されます。

実際に確認してみます！

# Windows 環境における Docker

Windows 10 Pro を所有する者は幸いである、[Docker for Windows](https://www.docker.com/products/docker-desktop) を使えるから。

僕は自宅は Windows 10 Home、職場は Windows 7 Pro というイマイチな環境なので、どちらも [Docker Toolbox](https://docs.docker.com/toolbox/overview/) しか使えないんですよね。悲しいです。

というわけで、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 は以下のショートカット・アイコンで開始します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/47bd9b89-c813-d282-8a89-1cc4848fe138.png)
このショートカットに設定されている実行コマンドはこちら。bash で `start.sh` というシェルスクリプトを実行しています。

```
C:\local\dev\Git\bin\bash.exe --login -i "C:\local\dev\Docker Toolbox\start.sh"
```

さて、ショートカットから起動してみましょう。最初の起動にはわりと時間がかかると思いますので、待ちましょう。

起動した Docker 環境がこちら。単なる bash 環境に、Docker の welcome メッセージが表示されているように見えますね。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/a3050edc-154a-6d20-6987-28423703f072.png)
そう、それで正解。これは docker 用にパスなど環境変数を事前にセットされた、単なる MinGW 上の bash 環境なのです。システム階層を簡単に表現すると、こんな感じ。

| bash.exe |
| :---: |
| MSYS/Mingw-w64 |
| Windows 10 Home |

ただし、先ほどの `start.sh` というシェルスクリプトには `docker-machine` コマンドが含まれており、裏でこっそり Docker サーバーを起動しています。最初の起動に時間がかかるのは、裏でサーバーが起動するのを待っているため。

# Docker サーバー

さて、裏でこっそり起動される Docker サーバーについて確認しましょう。`Oracle VM VirtualBox` アイコンで VirtualBox を起動します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/91d1bfe5-a9e9-0471-d926-f68fd7afef55.png)
すると Docker Toolbox インストール時に `default` という仮想マシンが作成されていることがわかります。これが Docker のサーバー側を担います。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/ac6f19d4-ea08-a75f-6a8b-03d35a05c966.png)
ちなみにこの仮想マシンの設定を変えれば、Docker 実行環境のスペックが変わりますね。例えば上記ではメモリ量が1024MB=1GBですが、これを変更すればメモリ量を増加できたり。ストレージの容量を変更したり、ストレージを追加したり。

気になったポイントとしては、ユーザーフォルダを共有していること。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/b31125c1-7513-5af9-87ff-f1d6dfa3fd2c.png)

このフォルダ配下には個人的なファイルや、設定ファイルがいろいろ入っていて、セキュリティ的にちょっと不安ですが大丈夫でしょうか… 個人写真を勝手にネットに上げちゃう悪意ある Docker イメージなんて出回っていないですよね。って心配性な自分ですw

まあ、それはさておき。

Linux起動用に `boot2docker.iso` のディスクイメージと、ストレージ用に `disk.vmdk` ディスクファイルが設定されていますね。以下のファイルのようです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/c53b2a7b-5496-734c-d337-7b636d9e5588.png)
さて、裏でこっそり起動している Docker サーバーとやらを、見てみましょう。といっても簡単、VirtualBox から該当イメージを「通常起動」するだけ。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/74f9da7f-93b3-02eb-2e0b-971cbaeacaca.png)
ほら、仮想マシン上で [boot2docker](https://github.com/boot2docker/boot2docker) 環境、つまり Docker 用の Linux 環境が普通に起動してくれます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/983952cb-0ea4-7e6a-92ab-bef83316f559.png)
システム階層を簡単に表現すると、こんな感じ？

| bash |
| :---: |
| Docker デーモン|
| boot2docker ディストリビューション |
| Linux OS |
| Oracle VM VirtualBox |
| Windows 10 Home |


まあ、普通はクライアント側で `docker-machine ssh default` で接続して使えばいいので、わざわざ仮想マシン側を表に出して起動する意味はありませんが。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/69c25276-564d-7e81-da41-75e2c7978e48.png)



# ちょっとした遊び

docker-machine コマンドか、VirtualBox のほうで default 仮想マシンを終了しておきます。ここで Docker クライアントを起動すると、起動に時間がかかるわけなのですが…

VirtualBox のほうも起動しておくと、裏でサーバーとなる仮想マシン default がこっそり起動していて、それをクライアントが待っている様子がよくわかります。一度、並べて見てみてくださいｗ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/2ae78516-5221-f5cc-72b7-7f992d7f2290.png)

# というわけで

Docker Toolbox をインストールして起動してみた、だけのネタだったりします。

ただ自分としては Docker がクラサバ環境で動いている、という情報が新鮮だったので、それを実際に試してみた、のでわりと面白かったです。

さーて、本は読んだし、モヤモヤも晴れたし、これから Docker について何か試してみますかね。

ではでは！