Windows環境にDocker Toolboxをインストールする

# はじめに
Docker、非常に便利ですね。Dockerを使用すればローカル環境を汚すことなく、様々なアプリケーションを実行できたりしてしまいます。Dockerに関する記事はネット上に豊富にありますが、いかんせん界隈の技術の進歩も早くすぐに情報が陳腐化してしまいます。

本稿ではDocker／周辺のエコシステムについてインプットして実際に実行したことをアウトプットしたいと思います。

# 導入環境
- Windows10 Home 64bit
- Intel Core i5-8250U CPU

# CPU仮想化を有効にする
インストールの前にCPUの仮想化が有効になっているか確認をします。無効の場合、Virtualization Technologyを有効にします。
1. タスクマネージャ⇒パフォーマンスタブ⇒CPU
2. 右下の[仮想化]が"無効"の場合、BIOSの設定から有効化します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/271387/008968fd-ab87-18c5-57ed-cec2454eafe1.png)
設定方法については"VT 有効化"等で検索するか、以下のサイトが参考になります。
>[DWAPP - CPU仮想化の確認（Windows10）](http://www.dwapp.top/environment/virtualization/817)
>[Tekwind - 仮想化機能を有効にするためのBIOS設定](https://www.tekwind.co.jp/ASU/faq/entry_134.php)

BIOSで設定を有効にしたら、タスクマネージャから確認しておきます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/271387/805f9cdf-0dcf-f589-68fa-51280abb5a9c.png)


# インストール
Windows環境でインストールできるDockerは「Docker Desktop(Windows)」もしくは「Docker Toolbox」です。
Docker Desktop(Windows)は以前はDocker for Windowsと呼ばれていました。Docker Desktop(Windows)はHyper-Vを使用したOSネイティブで動作します。そのため、必然的にHyper-Vを使用可能なエディション(Pro or Enterprise or Education)に限定されます。
今回導入する環境はWindows10のHomeエディションのため、Docker Toolboxをインストールします。

[Install Docker Toolbox on Windows](https://docs.docker.com/toolbox/toolbox_install_windows/ "Install Docker Toolbox on Windows")

上記サイトの"Get Docker ToolBox for Windows"リンクからダウンロードします。**Legacy desktop solution**の記載がありますが、特に問題はありません。インストール後に使用するDockerコマンドもDocker Desktopと違いはありません。

ダウンロードしたインストーラからインストールします（後述のNDIS5 driver以外はデフォルトでOKです）。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/271387/2af4dbaf-940a-f0d0-e577-f579a3c2fdeb.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/271387/47f30e7d-4935-c193-b7ec-aa1c30fa6ee5.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/271387/b21661a7-31c1-b067-af9f-3faae28bdc6f.png)
※一番下のチェックボックスはデフォルトではOFFですが、ONにしてNDIS5 driverを使用するようにします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/271387/6244d69a-dcb6-ad4c-6327-ca4ddffe0b81.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/271387/c467b7ef-9099-ca42-e2b6-3afd41feba6b.png)
※ユニバーサルシリアルバスコントローラーの確認が表示された場合はインストールします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/271387/7c28af9e-22ca-3d75-77e1-aeaac23bda12.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/271387/fd6c4835-ce9b-44a6-311b-7a3166734e50.png)

インストール後、デスクトップに**Oracle VM VirtualBox**、**Docker Quickstart Terminal**、**Kitematic (Alpha)**のショートカットが作成されます。

まず、Oracle VM VirtualBoxを実行し、VirtualBoxマネージャーを確認してみると仮想マシンはまだひとつもありません。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/271387/3ecf6f85-b4e7-cfc7-8d9a-a03e12c7c2ef.png)
次に、Docker Quickstart Terminalを実行します。諸々のセットアップが自動で行われた後、下記のような画面になればセットアップ含めてインストール完了です（途中、VirtualBoxによるコンピュータの変更ウインドウが表示された場合は"はい"を選択します）。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/271387/56de7d53-d490-eee4-3798-cf213db375a6.png)
再度、Oracle VM VirtualBoxマネージャーを確認してみます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/271387/e0c96790-341d-0881-921b-b4abdf3253d1.png)
`default`という名前の仮想マシンが作成されています。これがDocker(Toolbox)の実行環境になります。VirtualBoxマネージャーで何かを行うということは基本的にはありませんので、仮想マシンの作成後はあまり意識することはないかもしれません。

正常にインストールできているか、Dockerコマンドを実行して確認してみます。

```bash
$ docker --version
Docker version 18.03.0-ce, build 0520e24302
```

version情報が出力され、Dockerが正しくインストールされていることを確認できました。

また、現在ローカルPCに存在する実行環境は以下のコマンドで確認可能です。

```bash
$ docker-machine ls
NAME      ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER     ERRORS
default   *        virtualbox   Running   tcp://192.168.99.100:2376           v18.09.1
```

VirtualBoxマネージャーで確認したdefaultという名前の実行環境が起動しています。[ACTIVE]の`*`は現在接続しているということを表します。
# コンテナ起動
Dockerのインストールが無事完了したので、実際にコンテナを起動してみます。
DockerのコンテナはDockerイメージから作成します。以下のコマンドでローカルPCに存在するイメージの一覧を確認してみます。

```bash
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
```

当然ですがまだひとつもイメージが存在しないため、まず、ローカルPCにイメージをpullします。
Dockerには公式のイメージ保管レジストリである[Docker Hub](https://hub.docker.com/ "Docker Hub")があり、`docker image pull <image-name:Tag>`コマンドによりDocker Hubからイメージを取得可能です。

今回は[hello-worldイメージ](https://hub.docker.com/_/hello-world?tab=description)からコンテナを起動してみます。なお、pull時のTagは省略可能で、省略した場合はデフォルトでlatestタグのイメージを取得します。

```bash
$ docker image pull hello-world:latest
Digest: sha256:2557e3c07ed1e38f26e389462d03ed943586f744621577a99efb77324b0fe535
Status: Downloaded newer image for hello-world:latest
```

再度、イメージ一覧を確認してみます。

```bash
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              fce289e99eb9        3 weeks ago         1.84kB
```

hello-worldイメージをローカルPCにpull出来たので、このイメージからコンテナを起動してみます。`docker container run <image-name>`コマンドを使用します。

```bash
$ docker container run hello-world

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

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/
```

コンテナが作成・起動されました。`docker container ls -a`コマンドでコンテナの一覧を確認してみます。

```bash
$ docker container ls -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
57b684deeb76        hello-world         "/hello"            6 seconds ago       Exited (0) 6 seconds ago                       thirsty_swartz
```

hello-worldイメージを元にしたコンテナがひとつ存在しているのが確認できます(hello-worldコンテナは起動後、停止するため、STATUSがExitedとなっています)。`-a`オプションは停止しているコンテナも含めて一覧表示します。

なお、ローカル上にDockerイメージが存在しない状態で`docker container run ~`コマンドを実行した場合、run時にpullを行いコンテナを起動します。

また、Dockerコマンドについてはコマンド体系に変更があり、ネットの情報でも新旧コマンドが混在しています。がらりと変更になったわけではなく、現在も旧来のコマンドを使用可能ですが、できる限り新しいコマンドを使用するようにしましょう。
以下のQiitaが非常にまとまっており、参考になります。
>[docker container / image コマンド新旧比較](https://qiita.com/zembutsu/items/6e1ad18f0d548ce6c266)

コンテナは`docker container rm <container-id or container-name>`コマンドで削除できます。
コンテナIDを指定する場合は、削除対象のコンテナを特定できるレベルでOKで、IDを全桁指定しなくても問題ありません。

```bash
$ docker container rm 57b
57b
```

```bash
$ docker container ls -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
```


# おわりに
今回はdocker(toolbox)のインストールを行い、簡単なコンテナの起動までを行いました。hello-worldコンテナの場合、Dockerを使用するメリットが分かりづらいかもしれません。

手軽に有効利用できることとしては、公式のMySQLやPostgreSQL等のDBイメージがDocker Hubにあります。それらのイメージを使用することにより、ローカル環境にDBをインストールすることなく、ローカルの開発で手軽に様々なDB環境を構築・利用することができます。

Docker Desktopが利用できない環境でも、今回のようにDocker toolboxでDockerを利用することが可能ですので、利用してみてください。
最後に、公式ドキュメントのリンクになります。Dockerは開発スピードが早く、既存の機能がレガシーとなってしまうこともありますので公式サイトは適宜チェックするようにしましょう。

[Docker Documentation](https://docs.docker.com/ "Docker Documentation")