Windows Subsystem for Linux(WSL)上でDockerを動作させる

Dockerを使ってみようかなと思い立ち、今やるなら「Windows Subsystem for Linux(WSL)上で動かそう」と意気込んだものの、いろいろはまったので備忘録を残しておきます。
動作させるための手順だけ残そうか迷いましたが、はまった箇所も残しておこうかと。
さくっと動かしたい方は「Docker 17.09.0 を再インストール」以降から読んでもらえれば大丈夫です。

インストール

「Get Docker CE for Ubuntu」に書かれている通りに、リポジトリセットアップをごにょごにょやって最後に docker-ce で apt-get する。

# apt-get install apt-transport-https ca-certificates curl software-properties-common
# curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
# sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
# apt-get install docker-ce

docs.docker.com

バージョン表示されればインストールOK。

# docker version
Client:
 Version:           18.06.1-ce
 API version:       1.38
 Go version:        go1.10.3
 Git commit:        e68fc7a
 Built:             Tue Aug 21 17:24:51 2018
 OS/Arch:           linux/amd64
 Experimental:      false
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

Docker Engine の起動

今回 Windows Subsystem for Linux(WSL) に Docker をインストールしたわけですが、普通にやると Docker Engine が動作しないらしく
Webを調べてみるとどうやら下記の手順を踏む必要があるみたいです。

# apt update
# apt upgrade -y
# apt install -y docker.io
# cgroupfs-mount
# usermod -aG docker $USER
# service docker start

一度、WSLを抜けて管理者権限で再度起動して service コマンドで Docker を起動する。

# cgroupfs-mount
# service docker start

「 * Docker is running 」って出たら無事起動完了。

# service docker status
 * Docker is running   

hello-world イメージの実行

ここまできたわけですが、hello-worldイメージを動作させようとしても、下記のエラーが出てできません。

# docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
d1725b59e92d: Extracting [==================================================>]     977B/977B
docker: failed to register layer: Error processing tar file(exit status 1): invalid argument.
See 'docker run --help'.

これも調べてみると次の情報を提供してくれている方がおりまして、WSLではどうも Docker 17.09.1 以降バージョンは(現状)動作しないようです。

qiita.com

Docker 17.09.0 を再インストール

というわけで Docker 17.09.0 を再インストールしてやってみるとようやく動きました。

# apt-get purge docker-ce
# curl -O https://download.docker.com/linux/debian/dists/stretch/pool/stable/amd64/docker-ce_17.09.0~ce-0~debian_amd64.deb
# dpkg -i docker-ce_17.09.0\~ce-0\~debian_amd64.deb
# docker version
Client:
 Version:      17.09.0-ce
 API version:  1.32
 Go version:   go1.8.3
 Git commit:   afdb6d4
 Built:        Tue Sep 26 22:42:09 2017
 OS/Arch:      linux/amd64
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
# service docker start
# docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
d1725b59e92d: Pull complete
Digest: sha256:0add3ace90ecb4adbf7777e9aacf18357296e799f81cabc9fde470971e499788
Status: Downloaded newer image for hello-world:latest

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/

「Hello from Docker!」と出てて、とりあえず無事コンテナが動作したようです。

なお、ダウンロードしたイメージ、実行したコンテナはそれぞれdocker image ls、docker ps -aで確認可能です。

# docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              4ab4c602aa5e        6 weeks ago         1.84kB ★hello-world image

# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
4033ff160c8b        hello-world         "/hello"            19 seconds ago      Exited (0) 12 seconds ago                       youthful_boyd ★イメージから実行されたコンテナ
5536f7632792        hello-world         "/hello"            14 minutes ago      Exited (0) 14 minutes ago                       happy_mcnulty

hello-world イメージから2度コンテナを実行したので、docker ps -a の方は2行出力されています。
上記からわかる通り、一つのイメージからいくつもコンテナを作成することが可能となります(イメージは初回実行時のローカルになければダウンロード(pull)してきてくれるみたいです。次回以降はpullしたイメージを利用する)。
hello-worldは実行後すぐに終了するため、STATUS は Exited になってます。

終了したコンテナを削除するには、docker rmで。
指定したコンテナID「4033ff160c8b」のコンテナが削除されていることが確認できます。

# docker rm 4033ff160c8b
4033ff160c8b
docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
5536f7632792        hello-world         "/hello"            27 minutes ago      Exited (0) 27 minutes ago                       happy_mcnulty

次のように書いてあげると終了したコンテナをまとめて削除することができます。

# docker rm 'docker ps -aq'

今回はこんなところで。次は CentOS のイメージからコンテナ起動してコンテナないでパッケージインストールしたりしてみたいと思います。

以上です。

[環境情報]
Windows Subsystem for LinuxUbuntu 18.04.1 LTS)