WSLでDockerを動かそうとしたら苦戦した話

いきなり結論

仕事で docker-compose を使いたく、せっかくなのでWSL上で docker-compose しようとしたら、まったく上手くいかず大苦戦した。本記事はその格闘の記録である。

結論から述べると、WSL上でDockerを取り扱いたい場合、WSL 2、Docker for Desktop、そしてVisual Studio Codeの組み合わせがオススメだ。

コンポーネントのインストールと利用方法は以下のオフィシャルのドキュメントに任せるとして、本記事ではどのような問題が、何故発生したかについて述べる。

どこで躓いたのか?

問題の要旨は以下の通りだ。

  • 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 は以下の記事に詳しい。

実際に MS_SLAVE が使用されるようになった変更は以下のコミットを参照。