WSL(Ubuntu 18.04)上にDockerをインストールしてdocker run hello-worldまで

#想定している読者
・Windows 10 pro (version 1809)
・WSL(Ubuntu18.04)

これらを使ってDockerを使用したい方。しかし何故か、
```docker run hello-world```を実行すると次のようなエラーが出る方。

```
docker: Error response from daemon: failed to start shim: exec: "docker-containerd-shim": executable file not found in $PATH: unknown.
ERRO[0005] error waiting for container: context canceled
```


#解決策・結論
上記のエラーは、WSLで```docker version 18.09.7```を使用しているからです。
恐らく、WSLで```docker version 18.09.7```はまだサポートされていないと考えられます。
現時点(2019/08/12)で、WSL上にインストールすべきdockerのバージョンは**17.12.1**です。※CE（コミュニティエディション）において。

ここからは、
1. ```version 17.12.1```のインストールの仕方
2. ```sudo apt -y upgrade```してもdockerのversionを変更させない方法
の二点を説明していきます。

#1.version17.12.1のインストール&起動

```
$ sudo apt install docker.io=17.12.1-0ubuntu1
$ sudo cgroupfs-mount
$ sudo usermod -aG docker $USER
$ sudo service docker start
```
毎回、```sudo cgroupfs-mount && sudo service docker start```するのは面倒なので、Docker.shファイルを作成します。(ファイル名はなんでも良い)

```Docker.sh
#!/bin/sh
 pass=''  #Ubuntuのパスワード
 echo "$pass" | sudo -S cgroupfs-mount && sudo service docker start
 sleep 15
 docker version
```

ファイルに権限を与えます。

```
$ chmod 700 Docker.sh
```

このファイルのあるディレクトリで、```./Docker.sh```とコマンドを入力します。
※sudoの**-S**オプションは「パスワードを端末ではなく標準入力から読み込む」という意味です。```sudo service docker start```の後に、標準入力でパスワードを求められます。
※**#!/bin/sh**に関しては、[こちら](https://qiita.com/mohira/items/566ca75d704072bcb26f)の記事が詳しいです。


#2.特定のパッケージをupgradeさせない方法
apt-markを使い、パッケージのversionを固定する。

```
$ sudo apt-mark hold docker.io
 docker.io set on hold.
```

holdしたパッケージの一覧表示

```
$ apt-mark showhold
  docker.io
```

以上のように設定することで、```sudo apt -y upgrade```してもversionが勝手に変更されないです。

#3.docker run hello-world

WSL(Ubuntu18.04)を一度閉じて、**管理者権限**で開いてください。
先ほど、作成した```Docker.sh```でdockerを起動します。

```
$ ./Docker.sh
* Starting Docker: docker      [ ok ]                                                                                                                             
Client:
 Version:       17.12.1-ce
 API version:   1.35
 Go version:    go1.10.1
 Git commit:    7390fc6
 Built: Wed Apr 18 01:23:11 2018
 OS/Arch:       linux/amd64

Server:
 Engine:
  Version:      17.12.1-ce
  API version:  1.35 (minimum version 1.12)
  Go version:   go1.10.1
  Git commit:   7390fc6
  Built:        Wed Feb 28 17:46:05 2018
  OS/Arch:      linux/amd64
  Experimental: false
```




```
$ docker 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/
```

これで完了です:v:

#参考記事
[Windows10のバージョン1809のWSLでDockerが動作する環境を構築した](https://xn--v6q832hwdkvom.com/post/windows10%E3%81%AE%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B31809%E3%81%AEwsl%E3%81%A7docker%E3%81%8C%E5%8B%95%E4%BD%9C%E3%81%99%E3%82%8B%E7%92%B0%E5%A2%83%E3%82%92%E6%A7%8B%E7%AF%89%E3%81%97%E3%81%9F/)