なうびるどいんぐ

脳みそ常時-3dB

はじめてのWSL2 & Docker Desktop

      2021/04/17    HimaJyun

Windows10 + WSL2 + Dockerな環境を使い始めてしばらく経つので、当初抱いていた疑問とそれに対する現時点での回答をいくつかまとめておく。

スポンサーリンク

最初に書いておくと、この記事は自分が抱いていた疑問とそれに対する回答なので、「はじめての」とかタイトルに付けておきながら初心者向けのインストールや操作手順のようなものは一切出てこない。

WSL2

WSL2を使うためには「Windows の機能の有効化または無効化」でいくつかの機能を有効にする必要がある。

記事によって書いていることが違うが、WSL2を使うために最低限必要なのは「Linux 用 Windows サブシステム」と「仮想マシン プラットフォーム」

「Windows ハイパーバイザー プラットフォーム」は仮想化ソフトウェアとの共存に必要(=仮想化ソフトウェアを使わないのであれば不要)

仮想化ソフトウェアとの共存に「Hyper-V」が必要と記載しているサイトもあるが(公式ドキュメントがそう)、自分の環境ではこれはなくても動いている。ただの管理ツールっぽい?

(なんなら「Windows ハイパーバイザー プラットフォーム」が無効でも共存できている、なんで?)

VirtualBoxとの共存

WSL2を利用するためにはHyper-Vの有効化が必要ですが、これを有効にするとHyper-VがCPUの仮想化支援を占有してしまいVirtualBoxやVMwareのような仮想化ソフトウェアが動かなくなる。

この問題に対処するため、最近のバージョンでは仮想化ソフトウェアからHyper-Vの機能を呼び出して動作するような機能が実装されており、共存が可能になっている。

ただ、そのような複雑な事をしている故か環境や設定によって動いたり動かなかったりがある模様。

実際、初期のUbuntu 20.04ではSHAハッシュが一致しない的なエラーでインストールすら出来なかったり、aptがコケたりしていた。(最新版では修正されている)

WSL2やDockerが使えるようになるとVirtualBoxを使用する機会が激減したため、個人的には問題なし。

WSL2のパスワード

VMはホストから分離されているので使い捨て前提だと適当なパスワードを設定しがちだが、WSLではちゃんとしたパスワードを設定した方が良いと思う。

開発中に"よろしくない物"をうっかり入れてしまう可能性はなきにしもあらずで、/mnt/cなどが生えている関係からWSLにアクセス可能=Windows側のファイルも読み書きできるという意味なので。

WSL2とのファイルのやり取り

Windows側のエクスプローラーから¥¥wsl$¥にアクセスするとWSLのファイルを表示できる。
WSL2へのファイルアクセス

将来的にはエクスプローラーの左ペインにペンギンさん(Tux)マークが追加されて簡単にアクセスできるようになる予定。

/mnt/cが怖い

/mnt/cでCドライブの中身がマウントされているのが怖い。うっかり間違えてrm -rf /しちゃったら……

これは/etc/wsl.confを編集すれば剥がせます。

[automount]
enabled = false

[interop]
appendWindowsPath = false

もしくは、Read Onlyにしても良い。

[automount]
options = "ro"

設定内容はこちら: 公式ドキュメント

当たり前の事だが、書き込みが必要な用途でこの設定をすると書き込めなくなる。

ファイルのやり取りはWindows側(\\wsl$\)から送り込んだり取り出したりする運用をすればよいと思う。(つまり、WSL2から/mnt/cを使わないようにする)

そもそもWSL2とWindowsのファイルのやり取りはパフォーマンスが悪い。ソースコードなどは極力WSL2側に置くようにしてWindowsとのファイルのやり取りが最小になるようにしよう。

vhdxの移動

様々な事情(CドライブがSSDなので容量を温存したい、とか)でvhdxを移動したい時がある(デフォルトはCドライブに保存される)

その場合、exportしてimportするのが基本の模様。

MS社員の人がそう答えてるのでこの方法で大丈夫なはず。同様の方法でDocker Desktopのdocker-desktop-dataも移動できる。

とはいえ、最近は1TBほどのSSDでも十分手が届く値段なのでここまでして容量を温存したいことも少ないかも……?

同じディストリビューションを複数作る

正攻法(ストアからのインストール)では1つのディストリビューションにつき1個の環境しか作れない。

同じディストリビューションを複数インストールしたい時はストア以外の方法でのインストールが必要。

LxRunOfflineを使う方法がよくヒットするがそこまでする必要はなく、自分でroot fsのtarを拾ってきて別名でインポートしてやれば複数登録できる。(exportして別名でimportでもOK)

参考: WSL - Ubuntu Wiki

多少の違いがあっても構わないのであれば、近い系統の他のディストリビューションを使うのが一番簡単で手っ取り早い(例: UbuntuとDebianとか)

使い捨てたり検証のために複数動かしたいのであれば、そこはDockerの出番。

設定ファイルがリロードされない

exitしてwslだとWSLは起動しっぱなしなので設定ファイルがリロードされない。

exitしてからwsl --shutdownで停止させて、再度wslで起動するのが再起動の手順。

Docker Desktop

WSL2をバックエンドにして起動するだけ。
WSL2をバックエンドに

Windows→WSL2→Dockerとなるので、ファイルの扱いで違いがある。

ファイルの違い以外はLinuxマシンにインストールした時とほぼ同じ感覚で使える。とてもよい。

ファイル(-v)やポート(-p)はどうなる?

ポートは普通にWindows側にマッピングされる。

異なりがあるのはファイルの扱い。ファイルは相対指定ができず、常にC:\path\to\dirのように完全パスで指定する必要がある。

また、Windowsのファイルをコンテナ内にマウントすると「パフォーマンスが悪いから注意してね」という趣旨の通知が表示される。

その他

WSL2やDocker Desktopが揃うとWindows TerminalやVSCode(拡張機能のRemote Development)が真価を発揮する。

Windows TerminalにGitBashを追加

Windows TerminalにGitBashを追加した。WSLは自動で追加される。

{
    "guid": "{cb162a9b-3fc2-41c1-85da-e8494b03ff78}",
    "name": "Git Bash",
    "commandline": "C:\\Program Files\\Git\\bin\\bash.exe --login -i",
    "icon" : "C:\\Program Files\\Git\\mingw64\\share\\git\\git-for-windows.ico",
    "startingDirectory" : "%USERPROFILE%"
}

GUIDはPowerShellで[Guid]::NewGuid()などとすれば作成できる。

VSCodeのRemote Development

Remove DevelopmentはRemote - (WSL|Docker|SSH)の三種類の拡張機能をひとまとめにしたもの。

Remote - WSLは/mnt/cを引き剥がす設定をすると動かなくなる。厳密に言えばsh: 1: /scripts/wslServer.sh: not foundが出るようになる。

Remote - WSLを使いたければ/mnt/cが必要。なくても動くようになってほしい……

感想

使ってみた感じとしては、WSL2はVM代わりにポンポコと環境作って壊して……という物ではなさそう。

どちらかというと、Windowsの中にLinux環境用意しました!みたいな代物で、ガッツリと自分好みのカスタマイズを施して開発などに使う物だと思う。

環境構築の練習やテストなどの壊すこと前提の使い方であればDockerを使おう。

WSL2とDockerで用途が違うので上手く使い分けるのがコツ。

 - プログラミング , ,