6
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Windows環境(WSL2)のDockerを爆速化する方法

Last updated at Posted at 2022-11-14

目的

Windowsホスト環境下(WSL2)のDockerコンテナのファイルアクセスを高速化する

動機

これまでMacBookでそれなりにDocker環境によるシステム開発をそれなりに快適に進めてきたのですが、同僚たちのWindows PCでのDockerコンテナがあまりにも緩慢な動きをしていてびっくりしたので、問題を根本的に解決する方法を考えました。

原因

2022年11月現在、みなさんはWSL2とDocker Desktopの組み合わせで環境構築されていると思います。しかしWSL2下にあるLinux系のプロセスからのNTFSへのアクセスが極めてパフォーマンスが悪く、WSL2のテクノロジーの上で動作しているDocker Desktopもその影響をもろに受けています。

解決方法

DockerコンテナにNTFSへのアクセスをさせなければよい。WSL2にファイル置き場用のLinuxディストロ領域を確保し、そこに開発プロジェクト一式のソースコードを置いてそこからからDockerを立ち上げれば解決する。

作業手順

  1. WSL2にalpine linux(NAME=alpine)をインストールする
  2. Docker Desktopの設定でResource/WSL IntegrationでalpineのチェックをONにしてDocker Desktopを再起動
  3. alpineにgit, dockerをapkコマンドでインストールする
  4. alpineにLinux版のdocker-composeを直接インストールする
  5. alpineの/homeディレクトリ上でgitコマンドを実行し、ソースツリーをcloneする
  6. alpine上でdocker-composeを実行し、Docker DesktopにDockerコンテナをセットアップする
  7. vscodeなどのテキストエディタを \wsl$以下の開発ディレクトリで開く

WSL2にalpine linuxをインストールする

から最新版のalpine-minirootfsのtar.gzを入手します。

PowerShell上でwslコマンドを実行し、alpineの環境をインポートする

> wsl --import alpine c:\data\wsl\alpine c:\Download\alpine-minirootfs-3.16.3-x86_64.tar.gz --version 2
> wsl -l -v
  NAME                   STATE           VERSION
* alpine                 Running         2
  docker-desktop-data    Running         2
  docker-desktop         Running         2

これで以下のようなWSL2ゲストがWindows環境に追加されます。

  • ゲスト名
    • alpine
  • ストレージファイル設置場所(ext4.vhdx)
    • c:\data\wsl\alpine
    • 十分な空き容量があればディレクトリはどこでも良い
  • Sambaマウント場所
    • \\wsl$\alpine

alpine環境には

> wsl -d alpine

で入ることができます。

Docker Desktopの設定でResource/WSL IntegrationでalpineのチェックをONにしてDocker Desktopを再起動する

Resources
WSL Integration
Configure which WSL 2 distros you want to access Docker from.
Enable integration with my default WSL distro(チェックを入れる)
Enable integration with additional distros:

alpine(チェックを入れる)

ウィンドウ右下の再起動ボタンでDocker Desktopを再起動する

alpineにgit, dockerをapkコマンドでインストールする

> wsl -d alpine
# apk add git docker

alpineにLinux版のdocker-composeを直接インストールする

apkパッケージの範囲でちゃんと動作するv2系のdocker-compose が見つからなかったため、開発元から直接入手してインストールします。

Note: alpineではDocker DesktopがWSL IntegrationをONにしたときに自動的に設定される docker,docker-composeがalpineのELFと互換性がないため、このような形で手動セットアップしています。WSL版のUbuntuなどで本記事のセットアップをしているときは、WSL IntegrationをONにした段階で docker, docker-compose が実行できるようになっているでしょう。

から最新の docker-compose-linux-x86_64 を探してダウンロードし、

\\wsl$\alpine\usr\bin 以下にExplorerで移動させます。
ついで docker-compose-linux-x86_64 から docker-compose にリネームします。
そして実行権限を与えます。

# rm /usr/bin/docker-compose
# mv  /usr/bin/docker-compose-linux-x86_64 /usr/bin/docker-compose
# chmod 755 /usr/bin/docker-compose

そしてコマンドを実行し、alpine環境下で動作することを確認します。

# docker-compose

alpineの/homeディレクトリ上でgitコマンドを実行し、ソースツリーをcloneする

# cd /home
# git clone https://gitlab.com/yourcomany/your_project.git

alpine上でdocker-composeを実行し、Docker DesktopにDockerコンテナをセットアップする

# cd your_project
# docker-compose up -d --build

vscodeなどのテキストエディタを \\wsl$以下の開発ディレクトリで開く

alpineのWSL2へのセットアップが成功したとき、

\\wsl$\alpine\home\your_project

のパスでExprlorerから見える状態になっています。(Samba/Windowsファイル共有)
したがってこのディレクトリ以下で vscodeなどのテキストエディタを開けば、あとは普通にソースコードを書いてDockerのコンテナのプログラムを実行できるでしょう。

NTFS上のディレクトリを普通にマウントした場合と比べ、処理速度の差に驚くはずです。

ディレクトリの権限問題の対処

WindowsのディレクトリをDockerにマウントした場合、デフォルトでフルアクセス権限となっているため問題が表面化しないのですが、 WSL2配下のディレクトリをDockerにマウントした場合、普通に権限問題が発生します。なのでDockerコンテナが書き込むディレクトリを 777 権限にするのが手っ取り早いです。例えばこういうコマンドを実行することになるでしょう

(カレントディレクトリ以下の全てのディレクトリを外部ホスト(Dockerコンテナ)から読み書き可能にする)

# find . -type d|xargs chmod 777

以上。

6
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?