9prdr.sys
/init
というわけで、前記事で掲げていた目標「WSLでDockerをつかったWebアプリケーション開発ができるかどうか」について再確認します。
まず、Windowsの開発環境の構築ですが、既知の情報をふまえつつTIPSを順次紹介します。
WSLのパッケージ管理は下記2つを押さえておけば問題ないでしょう。
WSLttyはWSL2に対応しておらずConEmuは描画がくずれやすいため、デフォルトのターミナルかWindows Terminalが選択肢となります。
Windows TerminalとConEmuとの比較
- | Windows Terminal | ConEmu |
---|---|---|
透過対象 | backgroundImage | ConEmu自体 |
キーバインド制約 | Alt+Shiftが効かない | 特になし |
WSL2の描画 | 特になし | くずれる |
管理者権限で実行 | 初回のみ | タスク実行ごと |
WSL1ではDockerデーモンがつかえないのでWSL2でDockerをつかうようにしましょう。Docker CEをインストールします。
どうしてもWSL1でということであれば、Win32 (WSL1からみるとdrvfs) 側でDocker For Windowsを用意します。インストールはDockerのダウンロードページから手順通りおこないます。
構成等は前回の記事を参照ください。
WSL2は軽量Hyper-V上にLinuxコンテナを動かしているので、基本Hyper-Vと同様にDockerをつかうことができます。
ただし、WSL1と違いlocalhostにWSL2がバインドできません (2019-07-27追記: Build Version 18945で解決しました )。
また、WSL1と同様にWin32・WSL間でのファイルの読み書きにパフォーマンスの差が大きく出ています。
ひとつずつ解決方法を見ていきましょう。
WSL2がつかっているVirtual Switchはinternal onlyのため、Win32側からlocalhostをつかってWSL2にアクセスすることができません。現在対応中のようです (2019-07-27追記: Build Version 18945で解決しました )。
対処方法は2つあります。
a. WSL1をつかう
これが一番楽ですが、WSL1は次項であげるパフォーマンス上の欠点があるので、Web系フロントエンド開発におけるライブリローディング機能をつかうケースに限定するといいでしょう。
b. Hostsファイルをつかう
Win32のHostsファイルでWSL2のeth0インターフェイスのIPアドレスに適当なホスト名を割り当てます(ポートごとにホストを振り分けたい場合はWSL2側にProxyを用意するといいでしょう)。
# C:\Windows\System32\drivers\etc\hosts
172.17.72.217 dashboard.local.me
WSL2のIPアドレスはコンテナを立ち上げるごとに変わるので、下記のようなコマンドレットをWin32側のPowerShell $PROFILEに用意しておくといいでしょう。WSL2だけで完結したい方はシェル上から powershell.exe -Command 'Sync-HostsToWslIp'
と打つだけです。
# $PROFILE
function Sync-HostsToWslIp {
$hosts = "$env:SystemRoot\System32\drivers\etc\hosts";
$pattern = "\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}";
$wslip = bash.exe -c "ifconfig eth0 | grep 'inet '";
if ($wslip -match $pattern) {
$wslip = $matches[0];
} else {
echo "The Script Exited, the ip address of WSL 2 cannot be found";
exit;
}
cat $hosts | %{ $_ -match $pattern }
$rc = cat $hosts | %{ $_ -replace $matches[0], $wslip }
$rc | Out-File $hosts;
}
いろんな方がベンチマークを公開してるのでそれを参考にするといいでしょう。
Cf.
わたしは git status -sb
をよくつかうので、そのコマンドで簡単なベンチマークとりました。
# WSLx
$ cd ~/nabinno.github.io
$ \time -f %e git status -sb
# Win32/WSLx
$ cd ~/nabinno.github.io
$ \time -f %e powershell.exe -Command 'git status -sb'
# Win32
PS> cd ~/nabinno.github.io
PS> (Measure-Command { git status -sb }).TotalMilliseconds / 1000 | %{ [math]::Round($_, 2) }
Subject | WSL | Win32 |
---|---|---|
WSL1 | 0.47 | 0.09 |
WSL2 | 0.00 | 0.61 |
Win32/WSL1 | 2.66 | 1.91 |
Win32/WSL2 | 2.81 | 1.79 |
Win32 | 0.51 | 0.12 |
以前から要望があったものだと「デバイスアクセスができない」件があります。
9P導入前だとこれはElixirのIoTフレームワークNervesのように、WSL UtilitiesでWSLパスをWin32パスに変換してからWin32にあるデバイス関連ツールをつかうのが簡単な解決策でした。
$ fwup.exe -a -i $(wslpath -w -a _build/rpi0_dev/nerves/images/hello_nerves.fw) -t complete -d $(fwup.exe -D | sed 's/,.*//')
ただし9Pを導入したWindows 10 Version 1903以降は、WSL1もWSL2もともにWSLパスを変換せずにWin32にあるデバイス関連ツールをつかうことができます。
$ fwup.exe -a -i _build/rpi0_dev/nerves/images/hello_nerves.fw -t complete -d $(fwup.exe -D | sed 's/,.*//')
わたしの観測範囲では課題はほぼ問題ない状態になっていました。
おすすめ開発環境は下記のとおり
item | content |
---|---|
IDE | WSLx上のエディタ |
Webフロントエンド開発 | WSL1 |
Docker関連開発 | WSL2 |
dotfiles | WSLx、Win32を共有管理 |
Win32側のIDEをつかっているユーザーはパフォーマンス上の不満がまだあるかもしれませんが、WSLでDockerをつかったWebアプリケーション開発は十分できる、と言えそうです。つまり、Linux・macOS・WindowsによるWebアプリケーション開発は十分共有できる、と。
いい時代になりました。
テクノロジーの進化は、絶え間ない変化の中で私たちの日常を塗り替えてきました。時には経済的な危機が、新たな可能性を切り拓く契機となることもあります。そこで、過去のリセッション期に生まれたテクノロジーの足
ATKerneyの課題解決パターン は、課題の本質を見極め、効果的な戦略的構造化を通じて解決策を導き出す手法にフォーカスしています。この冒険の旅は、解決者と協力者たちが心を一つにし、課題に立ち向かう様
私はいわゆる就職氷河期世代です。周囲から時折漏れ聞こえる不平のような言葉がありますが、それを単なる不平として片付けるのはもったいない気がします。できれば、その中に新しい視点を見つけ、次のチャンスへ繋げ