いきなり結論
仕事で docker-compose
を使いたく、せっかくなのでWSL上で docker-compose
しようとしたら、まったく上手くいかず大苦戦した。本記事はその格闘の記録である。
結論から述べると、WSL上でDockerを取り扱いたい場合、WSL 2、Docker for Desktop、そしてVisual Studio Codeの組み合わせがオススメだ。
各コンポーネントのインストールと利用方法は以下のオフィシャルのドキュメントに任せるとして、本記事ではどのような問題が、何故発生したかについて述べる。
- Using Docker in Windows for Linux Subsystem (WSL) 2
- Docker Desktop WSL 2 backend
- Windows Subsystem for Linux (WSL) を Windows 10 にインストールする
どこで躓いたのか?
問題の要旨は以下の通りだ。
- Dockerは
docker-ce
17.09.1
以降、MS_SLAVE
を用いる。ところがWSLはMS_SLAVE
をサポートしていない。この問題を回避するためには17.09.0
以前のdocker-ce
を使う必要がある。 - しかしながら、新しいCompose file formatを使うためにはDocker Engine releaseも新しい必要がある。古い
docker-ce
をインストールし、新しいCompose file formatと組み合わせて使用した場合、クライアントのバージョンが古すぎる、と怒られる。 docker-ce
をアップデートすると動かなくなる。- 以下無限ループ。
というわけで、WSL上で新しいCompose file formatを使おうとするとデッドロックが発生してしまう。尚、ここで言う docker-ce
とは、WSL上で apt
でインストールできるパッケージを指す。
この問題を回避するために、WSL上でDockerを使う場合はWindows上にインストールされたDocker Desktopを使用する。
この際、WSL 2を利用することは必ずしも必須ではないが、前述のDockerのオフィシャルドキュメントでも以下の様に「WSL 2、Docker Desktop、Visual Studio Codeの組み合わせを推奨する」と述べられている。
We recommend that you have your code in your default Linux distribution for the best development experience using Docker and WSL 2. After you have enabled WSL 2 on Docker Desktop, you can start working with your code inside the Linux distro and ideally with your IDE still in Windows. This workflow can be pretty straightforward if you are using VSCode.
その他、参考文献
Compose file formatのバージョンとDocker Engine releaseのバージョンの対応は以下のオフィシャルドキュメントを参照。
MS_SLAVE
は以下の記事に詳しい。
- jygoro's comment from discussion "docker is running natively on wsl"
- WSL (Ubuntu 18. 04) にDockerを入れる - Qiita
実際に MS_SLAVE
が使用されるようになった変更は以下のコミットを参照。