Windows 10 に開発環境を作る(WSL2 Docker編)

ようやくちょっと時間ができたので、自宅のWindows10に開発環境を準備しようとした作業メモ①です。

WSL2 で Ubunutu をインストールする

Windows 10 に WSL をインストールする | Microsoft Docsなどを参考にするとよい。

気を付けるべきこと

Ubuntuをインストールしたら、WSL2でインストールされていることを確認しておきましょう。後述しますが、昔使った環境を流用しようとしたらWSL1だったので、余計な時間を使いました。

> wsl --list --verbose
  NAME            STATE           VERSION
* Ubuntu-20.04    Stopped         2

Ubuntu をとりあえず最新化

sudo apt-get update
sudo apt-get upgrade

((そういえば、apt-getよりaptを使う方がよかったんだよなーとか実行してから気付いた)

Docker をインストール

とりあえず Ubuntu20.04 でapt searchしてみると、Ubuntu のレポジトリにはdocker.ioがあるので何も考えずapt installすることが可能。一方で公式の、Install Docker Engine on Ubuntu | Docker Documentationに従ってインストール方法もあるようだ。

  • 公式の方法で 既存の Ubuntu18.04 環境にインストールするも失敗
  • 20.04 に docker.io をインストールするも失敗

したので、結局、新しい Ubuntu20.04 環境に Docker 公式の方法でインストールすることにします。

sudo apt-get update
sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

echo \
  "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io

docker の動作確認

デーモン起動 & デーモン起動確認 & Hello Worldをします。

$ sudo service docker start
 * Starting Docker: docker                                                                                       [ OK ]
$ sudo service docker status
 * Docker is running
$ sudo docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
b8dfde127a29: Pull complete
Digest: sha256:61bd3cb6014296e214ff4c6407a5a7e7092dfa8eefdbbec539e133e97f63e09f
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 Worldできました。よかった...

発生した問題

Docker デーモンが起動しない

Ubuntu18.04 において、Install Docker Engine on Ubuntu | Docker Documentationに従ってインストールを実施したところ、 Docker デーモンを起動しようとすると、一時的に起動しているようだがすぐ停止してしまう。

$ sudo service docker start
 * Starting Docker: docker                                                                                                        [ OK ]
$ sudo service docker status
 * Docker is running
$ sudo service docker status
 * Docker is not running

準備していた環境がだいぶ前に作ったUbuntu環境だったので、改めてUbuntu 20.04 LTSをインストールて、docker.ioを使ってみたり、改めて公式イメージを使ってみたが改善しない。

WSL 2でCannot connect to the Docker daemonと言われたら、デフォルトを確認する。 | Ginpen.comなどを確認すると、ちゃんと WSL2 が利用されているか確認した方がよさそうなので確認する。

> wsl --list --verbose
  NAME            STATE           VERSION
* Ubuntu-20.04    Running         1

...残念ながら WSL1 で動いていたようなので Version を変更する。うーん、無駄な時間を使ってしまった。

> wsl --set-default-version 2
この操作を正しく終了しました。

> wsl --set-version Ubuntu-20.04 2
変換中です。この処理には数分かかることがあります...
WSL 2 との主な違いについては、https://aka.ms/wsl2 を参照してください
変換が完了しました。

> wsl --list --verbose
  NAME            STATE           VERSION
* Ubuntu-20.04    Stopped         2

こうするとDockerデーモンが普通に起動するようになりました。

docker.io をインストールしても、Docker デーモンを起動できない

docker.ioをインストールする例が余り日本語で見つけられなかったのだが、apt show docker.ioでみるとパッケージ 1 つで動作しそうだし、apt changelog docker.ioしてみてもそこそこ更新はされてるようだったので、docker.ioを使っても大丈夫だろうと判断して実行しようとした。*1

しかし、docker.ioを WSL2 上の Ubuntu20.04 インストールして、docker デーモンを起動しようとするが、そもそもサービスとしてインストールされておらず起動できない。sudo service --status-allを実行しても表示されない。

$ sudo service docker start
docker: unrecognized service

どうやらdocker.iosystemctlで操作することが前提のようなのだが、WSL2 ではSystemdが無効化されていて、sytemctlは使えない。つまりdocker.ioを WSL2 で使うのは困難そうなことが分かった。このため Docker 公式の方法でインストールすることにした。

WSL2 において、なぜ Sytemd が使えないか&無理やり使う方法はこちらなどを参照のこと。 WSL2 で Systemd を使うハック - Qiita

※この後、UbuntuがWSL1で動いていたことが分かったのだが、どちらにしろ原因は上記だと思っています。

*1:docker.io と公式の docker の違いは、ubuntu - What is docker.io in relation to docker-ce and docker-ee? - Stack Overflowあたりを参考。