Windows 版 Docker クライアントのインストールと Linux上の Docker デーモンへの接続

# 概要
Windows 版の Docker クライアントを使ってみました。以下の手順をまとめてあります。

* Windows 版 Docker クライアントを、 Windows 10 と Windows 8.1 にインストール
* Windows 版 Docker クライアントから、 Linux 上の Docker デーモンを操作

Docker クライアントは [Toolbox](https://www.docker.com/toolbox) を使うと簡単にインストールできますが、今回は Docker クライアント単体でインストールしてみました。

環境は以下の通りです。Windows マシンはどこにあってもいいのですが、今回はてっとり早く Windows 10 を使いたかったので Microsoft Azure を使っています。Docker デーモンは、いつもの通り AWS EC2上です。
![DockerEnv.png](https://qiita-image-store.s3.amazonaws.com/0/79316/ccc18bf9-8deb-08df-6cc2-18dab41e64b7.png)


また、Docker のバージョンは、デーモンとクライアントの双方で 1.8.1 を使っています。

# Windows 版 Docker クライアントのインストール
Windows版 Dockerクライアントのインストールは、[Chocolatey](https://chocolatey.org/) という Windows のパッケージ管理ツールを使って行います。[Chocolatey](https://chocolatey.org/)  は、Windows 上で apt-get や yum と似たようなパッケージ管理ができるツールです。


## Windows 10 の場合

### Chocolatey と Docker のインストール
最初に Chocolatey をインストールします。

まずは、PowerShell を「管理者として実行」により起動。そして、PowerShellの実行ポリシーを RemoteSigned に変更。

```
PS C:\> Set-ExecutionPolicy RemoteSigned
```

そして、Chocolatey をインストールする。

```
PS C:\> Get-PackageProvider -Name Chocolatey

The provider 'chocolatey v2.8.5.130' is not installed.
chocolatey may be manually downloaded from https://oneget.org/ChocolateyPrototype-2.8.5.130.exe and installed.
Would you like PackageManagement to automatically download and install 'chocolatey' now?
[Y] Yes  [N] No  [S] Suspend  [?] Help (default is "Y"): Y

Name                     Version          DynamicOptions
----                     -------          --------------
Chocolatey               2.8.5.130        {SkipDependencies, ContinueOnFailure, ExcludeVersion, ForceX86...}
```

次に Docker クライアントをインストール。nuget をインストールするか聞かれるので Y を入力してインストールを行う。

```
PS C:\> Install-Package docker

The provider 'nuget v2.8.5.127' is not installed.
nuget may be manually downloaded from https://oneget.org/nuget-anycpu-2.8.5.127.exe and installed.
Would you like PackageManagement to automatically download and install 'nuget' now?
[Y] Yes  [N] No  [S] Suspend  [?] Help (default is "Y"): Y

The package(s) come from a package source that is not marked as trusted.
Are you sure you want to install software from 'chocolatey'?
[Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help (default is "N"): Y

Name                           Version          Source           Summary
----                           -------          ------           -------
docker                         1.8.1            chocolatey       Docker is an open platform for developers and sysad...
```

Docker クライアントは C:\Chocolatey 以下にインストールされる。
![Win10-DockerInstalled.PNG](https://qiita-image-store.s3.amazonaws.com/0/79316/9f13b4a0-25f5-55ae-bda1-d49f19b28651.png)



ただしChocolatey の問題で、C:\Chocolatey\bin が環境変数の PATH に追加されないので、コントロールパネルから手動で追加する。
![Win10-Path.PNG](https://qiita-image-store.s3.amazonaws.com/0/79316/6d1c5ea6-7794-a9b8-9362-9bf6621982f4.png)

### docker コマンドの実行
Docker クライアントのインストールが完了したので、コマンドプロンプトを起動してdocker クライアントを実行する。
![Win10-DockerVer.PNG](https://qiita-image-store.s3.amazonaws.com/0/79316/33df6951-9fdf-50c6-330f-e99edfe87ebc.png)

ちゃんとインストールされたことが確認できた。



## Windows 8.1 の場合

### Chocolatey と Docker のインストール
コマンドプロンプトを「管理者として実行」により起動して、以下のコマンドを実行。

```
C:\> @powershell -NoProfile -ExecutionPolicy Bypass -Command "iex ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1'))" && SET PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin
```

次に Docker をインストールする。

```
C:\> choco install docker
```

途中でスクリプトを実行するか聞かれるので「1) yes」を指定する。
![Win8-Install.PNG](https://qiita-image-store.s3.amazonaws.com/0/79316/d6125f3f-b971-928c-b7f3-01f850003d11.png)


なお、PATH の設定は自動で行われるので、手動での設定は不要。

### docker コマンドの実行
コマンドプロンプトから Dockerクライアントを実行してみる。
![Win8-DockerVer.PNG](https://qiita-image-store.s3.amazonaws.com/0/79316/59884efd-8929-512b-0759-24f1222bcd5e.png)

ちゃんとインストールされたことが確認できた。

# Linux 上での Docker デーモンの起動

Dockerデーモンは、デフォルトでは unix:///var/run/docker.sock をリッスンして、ローカルの root ユーザーか docker グループのユーザーからしかアクセスできないようになっている。なので、外部のWindows から Docker デーモンに接続できるようにTCPポートをリッスンする必要がある(後述の「！！注意！！」を参照)。

まず、すでに Docker デーモンが起動していたら停止する。

```bash
sudo systemctl stop docker.service
```

次に外部から接続できるように Docker デーモンを起動。

```bash
$ sudo docker daemon -H tcp://0.0.0.0:5555 &
```

Docker 1.8 より前のバージョンを使っている場合は次のように実行。

 ```bash
$ sudo docker -d -H tcp://0.0.0.0:5555 &
```

最後に、検証環境が AWS EC2 なので、上記のポート(TCP 5555) を通すようにセキュリティグループを追加しておく。

# Windows 版 Dockerクライアントから Dockerデーモンの操作

Docker デーモンのホストIP(EC2インスタンスのPublic IP)とポート(TCP 5555)を指定して、次のようにコマンドを実行する。

```
docker -H tcp://<ホストのIP>:<ホストのポート> images
```

Windows 10 からコンテナを起動してみる。
![Win10-DockerCmd.PNG](https://qiita-image-store.s3.amazonaws.com/0/79316/0b186b6e-9d97-7f2b-2c91-88b4451ed0c8.png)

Winodws 8.1 から同じ Docker デーモンに接続すると、(当たり前だが)作成されたコンテナが見える。
![Win8-DockerPS.PNG](https://qiita-image-store.s3.amazonaws.com/0/79316/7aee583d-3443-6e95-36af-ff5d31f3b837.png)


# ！！注意！！
今回は検証目的で外部から Docker デーモンに接続できるようにしているが、任意の人が Docker デーモンに接続できてしまうリスクがあるため、以下のような対策が必要。

* Docker デーモン起動時に、TLSを使った認証を有効にする([ここを参照](https://docs.docker.com/articles/https/))
* EC2 のセキュリティグループで、Dockerデーモンのホストに接続できるIPを制限する



# 参考サイト
* https://twitter.com/ahmetalpbalkan/status/632242697303011328
* https://azure.microsoft.com/blog/2015/04/16/docker-client-for-windows-is-now-available/
* http://dev.classmethod.jp/cloud/aws/docker-client-for-windows/
* https://docs.docker.com/installation/windows/
* https://docs.docker.com/articles/basics/