WindowsでのDocker環境構築からコンテナ起動まで　～DockerToolboxインストールの際、既にVirtualBoxを利用している場合は注意！

##はじめに　※環境構築前にインストールされているVirtualBoxを一旦アンインストールしてください。

やらないとDocker環境及び既存の仮想マシンが全て立ち上がらなくなるので焦ります。この記事で主に書きたかったのはこれだけ。
後はよくある環境構築～dockerコンテナ起動までの覚書です。

## 環境構築

### Dockerのインストール

#### Windows 10 Pro, Windows serverの場合

上記なら通常のインストーラーを利用したインストール方法は以下でいけるようです。

1. Docker for windowsの[Installerサイト](https://store.docker.com/editions/community/docker-ce-desktop-windows)へ移動し、[Get Docker CE for Windows]をクリック。インストーラーをダウンロード
2. ダウンロードしてきた[Docker for Windows Installer.exe]を実行

※Homeエディションでは`Docker for Windows requires Windows 10 Pro or Enterprise version 14393, or Windows server 2016 RTM to run`というエラーが発生。

私はHomeエディションなので試せていませんが、Windows 10 Proの方が快適なDocker環境を得る方法もせっかくなので載せておきます。
[Docker for Windowsで快適な環境を得るまでの そこそこ長い闘い](https://qiita.com/YukiMiyatake/items/73c7d6c4f2c9739ebe60)

#### Windows 10 Home(64 bit)の場合

私の環境はこちら。通常のインストーラーでエラーが発生したので"Docker for Windows" "Home edition"で検索。[こちらの記事] (https://qiita.com/idani/items/fb7681d79eeb48c05144)を参考にDockerToolboxのインストール実施。

1. Docker for windowsの代わりに[Docker Toolbox](https://docs.docker.com/toolbox/overview/)をインストール。
2. 「Docker Quickstart Terminal」を実行。しばらく初期設定としてアプリケーションのダウンロードが行われます。[Oracle Virtual Box]もここでインストールされます。
3. 正常にインストールが完了していればこれだけでOK。

正しく起動できた場合には以下アスキーアートが表示されます。かわいい
<img width="734" alt="docker.png" src="https://qiita-image-store.s3.amazonaws.com/0/252277/7f969301-b5a7-2dbb-8da4-6fb1db4606cf.png">

- 注意

はじめに記載したように、**VirtualBoxインストール済みの環境で上記を実行するとdockerをはじめVirtualBoxの各イメージが起動できなくなります**。
VirtualBoxをアンインストールせずにDockerToolboxをインストールした場合は、**慌てずにVirtualBox, DockerToolboxをアンインストールし、DockerToolboxのみをインストールしてください**。
DockerToolboxインストール後の初期設定時にVirtualBoxがデフォルト設定でインストールされるので、既存の仮想マシンも含めて正しく起動できるようになります。

#### 初期設定でインストールされた仮想マシンはなんなのか？

Docker Toolboxを起動し、`docker-machine ssh`で仮想マシンにログインできます(ログイン先は当然VirtualBoxで起動されているマシンと同じ)。ちょっと中身を見てみました。

**OS: TinyCoreLinux 8.2.1**

初めて聞いたOSですが、Linuxの中でもサイズの小さいものみたいですね。

>開発リーダーのRobertはTiny Core Linuxのプロジェクトにおいて「より小さなLinux」を作ることを標榜しており、Tiny Core Linux自身(Core)は13MBしかなく、デスクトップ向けLinuxとしてはもっとも小さい部類に入る。一番大きいパッケージであるCorePlusでも179MB。

最小構成で、新しいコマンドはtceというコマンドを使ってインストールするようです。少し覗いてみましたが、Linux経験者になじみのあるdebianやredhatの構成とは若干違う。デフォルトもusキーボードなのでちょっと面倒ですが、中身を色々見てみるのも面白そうです。
[Tiny Core Linux7のCoreをHDDにインストール](https://qiita.com/hachisukansw/items/714e7bf14ea07b28eec9)をはじめ、Tiny Core Linuxに関するQiitaの記事も沢山あります。

## Dockerを利用する
### Dockerコマンドを利用してコンテナを動作させるまでの流れ

Dockerコマンドを利用して、仮想環境でコンテナを動かすまでの流れはこんな感じ。

1. `docker build or docker pull`でイメージを用意
2. `docker run イメージ名`でコンテナを作成。コンテナ上で設定されたプロセスが動作する。
3. `docker start/stop コンテナ名`でコンテナ内のプロセスが開始/停止。runの時点で開始している。
4. `docker commit`でコンテナをイメージ化することも出来ます。

触っていないとすぐ忘れそうなので図にしておきます。参考:[Dockerにおけるコンテナのライフサイクル](http://enakai00.hatenablog.com/entry/20140628/1403933390)
<img width="800" alt="dockerイメージ.png" src="https://qiita-image-store.s3.amazonaws.com/0/252277/e007a554-4f64-7e98-55be-27c9079935e6.png">

Dockerイメージは**[Dockerhub](https://hub.docker.com/)にあるものをpullして利用する**ことが出来ます。便利ですね。
その他のDockerコマンド一覧:[Dockerコマンドメモ](https://qiita.com/curseoff/items/a9e64ad01d673abb6866)

### 実際に動かしてみる

試しにhttpd(apache)のイメージを落としてきて使ってみました。Docker Toolboxで以下を実行。

1. `docker pull httpd`
2. `docker run -p 8080:80 httpd`

`-p`オプションで仮想マシンの8080ポートアクセスをコンテナ側の80ポートに転送するよう設定しています。

一旦ctr+Qで抜けた後`docker ps`で確認。`brave_lewin`という名前のコンテナが動作しているのが確認できます。
このデフォルトのコンテナ名、有名な学者の名前からランダムで設定されるらしいです。こういう遊び心いいですよね。

```
$ docker ps
CONTAINER ID        IMAGE               COMMAND              CREATED             STATUS              PORTS                  NAMES
f3a4130f6dbd        httpd               "httpd-foreground"   26 minutes ago      Up 26 minutes       0.0.0.0:8080->80/tcp   brave_lewin
```

上記を実行することでhttpdが仮想環境内のdockerコンテナ上で動作します。仮想マシンのIP宛に、run時に指定したポートに向けてアクセスすればこのようにコンテナへのアクセスが出来、デフォルトのトップページが表示されます。

<img width="800" alt="ItWorks.png" src="https://qiita-image-store.s3.amazonaws.com/0/252277/8741513e-52e2-eb7f-effa-83d9c539d62d.png">

### Dockerのネットワーク構成を弄る

ポートフォワードで接続する形だと遊べる幅が狭まるので、色々ネットワーク構成を弄れるようになりたいですね。
以下記事を見ていると`docker network`で色々とネットワーク構成が変えられそうです。楽しそう！

[Dockerで自由なネットワーク構成を組む](https://qiita.com/marufeuille/items/b4065c8756e2a92b18aa#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB)