目的
Windowsホスト環境下(WSL2)のDockerコンテナのファイルアクセスを高速化する
動機
これまでMacBookでそれなりにDocker環境によるシステム開発をそれなりに快適に進めてきたのですが、同僚たちのWindows PCでのDockerコンテナがあまりにも緩慢な動きをしていてびっくりしたので、問題を根本的に解決する方法を考えました。
原因
2022年11月現在、みなさんはWSL2とDocker Desktopの組み合わせで環境構築されていると思います。しかしWSL2下にあるLinux系のプロセスからのNTFSへのアクセスが極めてパフォーマンスが悪く、WSL2のテクノロジーの上で動作しているDocker Desktopもその影響をもろに受けています。
解決方法
DockerコンテナにNTFSへのアクセスをさせなければよい。WSL2にファイル置き場用のLinuxディストロ領域を確保し、そこに開発プロジェクト一式のソースコードを置いてそこからからDockerを立ち上げれば解決する。
作業手順
- WSL2にalpine linux(NAME=alpine)をインストールする
- Docker Desktopの設定でResource/WSL IntegrationでalpineのチェックをONにしてDocker Desktopを再起動
- alpineにgit, dockerをapkコマンドでインストールする
- alpineにLinux版のdocker-composeを直接インストールする
- alpineの/homeディレクトリ上でgitコマンドを実行し、ソースツリーをcloneする
- alpine上でdocker-composeを実行し、Docker DesktopにDockerコンテナをセットアップする
- 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
以上。