docker desktop for windows + WSL で docker 環境

# 概要
ubuntu や docker の version によっては WSL 上だけで docker が動くとか動かないとかあるみたいですが、とりあえず安定してそうな docker desktop for windows の docker デーモンを利用する方法のメモ。

# 環境
Windows10 Pro
バージョン 1803
WSL ... Ubuntu 18.04 LTS

[WSLのインストール方法](https://qiita.com/tkj06/items/b5c195db860241663485)

# docker desktop for windows のインストール
[公式に従ってインストール](https://docs.docker.com/docker-for-windows/install/)
Docker hub の登録が必要です。以前は必要なかったような。。。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275553/d64e9da2-b7d3-07e2-265e-cf43df839394.png)
<img width="872" alt="docker_windows_install.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275553/763d9126-ac3a-359a-c768-2191a86d7e91.png">

stable 版のインストーラーがダウンロードされます。
↓でも選べます。
https://hub.docker.com/editions/community/docker-ce-desktop-windows


ローカルでの設定画面はまた後で


# WSL への docker 設定
公式の手順に従います。
[ubuntu に対する docker のインストール公式](https://docs.docker.com/install/linux/docker-ce/ubuntu/)

## 古いバージョンのアンインストール
↓は古いバージョンが入っていない場合。

```bash
unix_user:~$ sudo apt remove docker docker-engine docker.io containerd runc

[sudo] password for unix_user:
Reading package lists... Done
Building dependency tree
Reading state information... Done
Package 'docker' is not installed, so not removed
Package 'containerd' is not installed, so not removed
Package 'docker.io' is not installed, so not removed
Package 'runc' is not installed, so not removed
Package 'docker-engine' is not installed, so not removed
The following package was automatically installed and is no longer required:
  libfreetype6
Use 'sudo apt autoremove' to remove it.
0 upgraded, 0 newly installed, 0 to remove and 248 not upgraded.
```

## docker 用 apt リポジトリ追加
### /var/lib/apt 以下のパッケージ情報更新
(パッケージ情報の更新であって、この更新されたパッケージ情報をもとに実際にパッケージを更新するコマンドは `apt upgrade`)

```bash
unix_user:~$ sudo apt update
Get:2 http://security.ubuntu.com/ubuntu bionic-security InRelease [88.7 kB]
Hit:3 http://archive.ubuntu.com/ubuntu bionic InRelease
Get:1 https://packages.cloud.google.com/apt kubernetes-xenial InRelease [8993 B]

# ~~~
Fetched 4165 kB in 20s (206 kB/s)
Reading package lists... Done
```

### HTTPS経由でリポジトリを使用できるようにパッケージをインストール
途中↓のような怖い画面になりますが yes で大丈夫。

```bash
unix_user:~$ sudo apt install \
>     apt-transport-https \
>     ca-certificates \
>     curl \
>     gnupg-agent \
>     software-properties-common
Reading package lists... Done
Building dependency tree
Reading state information... Done
ca-certificates is already the newest version (20180409).
The following package was automatically installed and is no longer required:
  libfreetype6
# ~~~いろいろ続く
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275553/142ebee3-6bd4-d9a3-7b2b-e385f60cb899.png)


### Dockerの公式GPGキーを追加
GPG キーについてあまりよくわかっていない。。

```bash
unix_user:~$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
OK

# 指紋のあるキーが存在することを確認(どういうこと？)
unix_user:~$ sudo apt-key fingerprint 0EBFCD88
pub   rsa4096 2017-02-22 [SCEA]
      9DC8 5822 9FC7 DD38 854A  E2D8 8D81 803C 0EBF CD88
uid           [ unknown] Docker Release (CE deb) <docker@docker.com>
sub   rsa4096 2017-02-22 [S]
```

### リポジトリの設定
stable 以外も選べる模様

```bash
unix_user:~$ sudo add-apt-repository \
>    "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
>    $(lsb_release -cs) \
>    stable"
Hit:2 http://archive.ubuntu.com/ubuntu bionic InRelease
Hit:1 https://packages.cloud.google.com/apt kubernetes-xenial InRelease
Hit:3 http://archive.ubuntu.com/ubuntu bionic-updates InRelease
Hit:4 http://archive.ubuntu.com/ubuntu bionic-backports InRelease
Get:5 https://download.docker.com/linux/ubuntu bionic InRelease [64.4 kB]
Hit:6 http://security.ubuntu.com/ubuntu bionic-security InRelease
Get:7 https://download.docker.com/linux/ubuntu bionic/stable amd64 Packages [8525 B]
Fetched 73.0 kB in 7s (10.5 kB/s)
Reading package lists... Done
```

追加されたリポジトリの確認

```bash
unix_user:~$ cat /etc/apt/sources.list
# See http://help.ubuntu.com/community/UpgradeNotes for how to upgrade to
# newer versions of the distribution.
deb http://archive.ubuntu.com/ubuntu/ bionic main restricted
# deb-src http://archive.ubuntu.com/ubuntu/ bionic main restricted

## Major bug fix updates produced after the final release of the
## distribution.
deb http://archive.ubuntu.com/ubuntu/ bionic-updates main restricted
# deb-src http://archive.ubuntu.com/ubuntu/ bionic-updates main restricted

# ~~~~いろいろ続く

deb http://security.ubuntu.com/ubuntu/ bionic-security main restricted
# deb-src http://security.ubuntu.com/ubuntu/ bionic-security main restricted
deb http://security.ubuntu.com/ubuntu/ bionic-security universe
# deb-src http://security.ubuntu.com/ubuntu/ bionic-security universe
deb http://security.ubuntu.com/ubuntu/ bionic-security multiverse
# deb-src http://security.ubuntu.com/ubuntu/ bionic-security multiverse

# ちゃんと追加されている
deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable
# deb-src [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable
```

## DOCKER ENGINEのインストール
新しくレポジトリを追加したので再びパッケージ情報の更新

```bash
unix_user:~$ sudo apt update
Hit:1 https://download.docker.com/linux/ubuntu bionic InRelease
Hit:3 http://archive.ubuntu.com/ubuntu bionic InRelease
Hit:4 http://security.ubuntu.com/ubuntu bionic-security InRelease
Hit:2 https://packages.cloud.google.com/apt kubernetes-xenial InRelease
Hit:5 http://archive.ubuntu.com/ubuntu bionic-updates InRelease
Hit:6 http://archive.ubuntu.com/ubuntu bionic-backports InRelease
Reading package lists... Done
Building dependency tree
Reading state information... Done
243 packages can be upgraded. Run 'apt list --upgradable' to see them.
```
Docker Engine-Community、containerd の最新バージョンをインストール

```bash
unix_user:~$ sudo apt install docker-ce docker-ce-cli containerd.io
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following package was automatically installed and is no longer required:
  libfreetype6
Use 'sudo apt autoremove' to remove it.
The following additional packages will be installed:
  aufs-tools cgroupfs-mount libltdl7 pigz
The following NEW packages will be installed:
  aufs-tools cgroupfs-mount containerd.io docker-ce docker-ce-cli libltdl7 pigz
0 upgraded, 7 newly installed, 0 to remove and 243 not upgraded.
Need to get 88.0 MB of archives.
After this operation, 390 MB of additional disk space will be used.
Do you want to continue? [Y/n] Y
Get:1 https://download.docker.com/linux/ubuntu bionic/stable amd64 containerd.io amd64 1.2.6-3 [22.6 MB]
Get:2 http://archive.ubuntu.com/ubuntu bionic/universe amd64 pigz amd64 2.4-1 [57.4 kB]
Get:3 http://archive.ubuntu.com/ubuntu bionic/universe amd64 aufs-tools amd64 1:4.9+20170918-1ubuntu1 [104 kB]
Get:4 http://archive.ubuntu.com/ubuntu bionic/universe amd64 cgroupfs-mount all 1.4 [6320 B]
Get:5 http://archive.ubuntu.com/ubuntu bionic/main amd64 libltdl7 amd64 2.4.6-2 [38.8 kB]
Get:6 https://download.docker.com/linux/ubuntu bionic/stable amd64 docker-ce-cli amd64 5:19.03.2~3-0~ubuntu-bionic [42.5 MB]
Get:7 https://download.docker.com/linux/ubuntu bionic/stable amd64 docker-ce amd64 5:19.03.2~3-0~ubuntu-bionic [22.7 MB]
Fetched 88.0 MB in 1min 2s (1430 kB/s)
Selecting previously unselected package pigz.
(Reading database ... 35013 files and directories currently installed.)
Preparing to unpack .../0-pigz_2.4-1_amd64.deb ...
Unpacking pigz (2.4-1) ...
Selecting previously unselected package aufs-tools.
Preparing to unpack .../1-aufs-tools_1%3a4.9+20170918-1ubuntu1_amd64.deb ...
Unpacking aufs-tools (1:4.9+20170918-1ubuntu1) ...
Selecting previously unselected package cgroupfs-mount.
Preparing to unpack .../2-cgroupfs-mount_1.4_all.deb ...
Unpacking cgroupfs-mount (1.4) ...
Selecting previously unselected package containerd.io.
Preparing to unpack .../3-containerd.io_1.2.6-3_amd64.deb ...
Unpacking containerd.io (1.2.6-3) ...
Selecting previously unselected package docker-ce-cli.
Preparing to unpack .../4-docker-ce-cli_5%3a19.03.2~3-0~ubuntu-bionic_amd64.deb ...
Unpacking docker-ce-cli (5:19.03.2~3-0~ubuntu-bionic) ...
Selecting previously unselected package docker-ce.
Preparing to unpack .../5-docker-ce_5%3a19.03.2~3-0~ubuntu-bionic_amd64.deb ...
Unpacking docker-ce (5:19.03.2~3-0~ubuntu-bionic) ...
Selecting previously unselected package libltdl7:amd64.
Preparing to unpack .../6-libltdl7_2.4.6-2_amd64.deb ...
Unpacking libltdl7:amd64 (2.4.6-2) ...
Setting up aufs-tools (1:4.9+20170918-1ubuntu1) ...
Setting up containerd.io (1.2.6-3) ...
Created symlink /etc/systemd/system/multi-user.target.wants/containerd.service → /lib/systemd/system/containerd.service.
Processing triggers for ureadahead (0.100.0-20) ...
Setting up cgroupfs-mount (1.4) ...
invoke-rc.d: could not determine current runlevel
Processing triggers for libc-bin (2.27-3ubuntu1) ...
Processing triggers for systemd (237-3ubuntu10.3) ...
Setting up libltdl7:amd64 (2.4.6-2) ...
Processing triggers for man-db (2.8.3-2) ...
Setting up docker-ce-cli (5:19.03.2~3-0~ubuntu-bionic) ...
Setting up pigz (2.4-1) ...
Setting up docker-ce (5:19.03.2~3-0~ubuntu-bionic) ...
Created symlink /etc/systemd/system/multi-user.target.wants/docker.service → /lib/systemd/system/docker.service.
Created symlink /etc/systemd/system/sockets.target.wants/docker.socket → /lib/systemd/system/docker.socket.
invoke-rc.d: could not determine current runlevel
Processing triggers for ureadahead (0.100.0-20) ...
Processing triggers for libc-bin (2.27-3ubuntu1) ...
Processing triggers for systemd (237-3ubuntu10.3) ...
```

# docker コマンドの確認 on WSL
このままの設定だと失敗します。

```bash
unix_user:~$ sudo docker run hello-world
docker: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?.
See 'docker run --help'

# server 側の情報がない
unix_user:~$ docker version
Client: Docker Engine - Community
 Version:           19.03.2
 API version:       1.40
 Go version:        go1.12.8
 Git commit:        6a30dfc
 Built:             Thu Aug 29 05:29:11 2019
 OS/Arch:           linux/amd64
 Experimental:      false
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
```

## docker desktop for windows の docker デーモンを WSL から使えるようにする
- Expose daemon on tcp://localhost:2375 without TLS

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275553/97b5044d-bb33-e5b8-045c-4a50789b911d.png)

```bash:~/.bashrc
# 以下を追加。bash 起動時に読み込まれる
echo "export DOCKER_HOST='tcp://0.0.0.0:2375'" >> ~/.bashrc
source ~/.bashrc
```

```bash
# server 側の起動情報が出現！
unix_user:~$ docker version
Client: Docker Engine - Community
 Version:           19.03.2
 API version:       1.40
 Go version:        go1.12.8
 Git commit:        6a30dfc
 Built:             Thu Aug 29 05:29:11 2019
 OS/Arch:           linux/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.1
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.12.5
  Git commit:       74b1e89
  Built:            Thu Jul 25 21:17:52 2019
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          v1.2.6
  GitCommit:        894b81a4b802e4eb2a91d1ce216b8817763c29fb
 runc:
  Version:          1.0.0-rc8
  GitCommit:        425e105d5a03fabd737a126ad93d62a9eeede87f
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683
```

```bash
# 成功
unix_user:~$ 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/
```

### ただし sudo だと動かない
理由は不明。

```bash
unix_user:~$ sudo docker run hello-world
[sudo] password for unix_user:
docker: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?.
See 'docker run --help'.
```

# おまけ WSL に docker-compose もインストールする
バイナリをダウンロードして使用します。
pip でもできる模様。

[docker-compose の Linux へのインストール](https://docs.docker.com/compose/install/#install-compose)

リリースされてるバージョンはこちらで確認。
https://github.com/docker/compose/releases

```bash:stableリリースダウンロード
unix_user:~$ sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   617    0   617    0     0   1497      0 --:--:-- --:--:-- --:--:--  1501
100 15.4M  100 15.4M    0     0  1222k      0  0:00:12  0:00:12 --:--:-- 1436k

# 実行権限を追加
unix_user:~$ sudo chmod +x /usr/local/bin/docker-compose
```

## アンインストール
バイナリなので消すだけでok

```bash
unix_user:~$ sudo rm /usr/local/bin/docker-compose
```