この記事の目的
- Dev Containersを利用した記事は多いが環境切り替えを前提としているものが多い。また特にディスク周りのパフォーマンスが気になり一部退避するなどの設定が煩わしい。
- 以前からWSL2+Ubuntu内でコンテナ開発を行っていた際にはパフォーマンスは問題ないと感じていた。
- そこでDev Containersに同様のパターンを適用したところ想定通りの環境構築に成功した。
今回のパターンの記事は見かけないため、その手順を記載させていただきました。
Dev Containersとは
- VSCodeの拡張機能でDockerコンテナ内で開発ができる機能。
- JSONで定義して環境を構築が可能。ファイルもホストとコンテナ間で同期される前提で設定される。
- また既に実行中のコンテナに対しても接続できるため、コンテナ内のファイルを直接確認や編集することもできる。
- また、コンテナ内でサーバ機能を立ち上げた際にVSCodeがポートを開いてくれるため、ブラウザ等外部からアクセスできる。
など、非常に魅力的な機能が満載です。
その一方でDocker DesktopやRancher Desktopなどを利用する記事が多いため、そのまま適用するとDockerのバインドマウントでのパフォーマンスの悪さが気になってしまうのではないかと思いました。
パフォーマンスの問題回避方法とは
- WSL2+Ubuntu上でDev Containersを構築することで、バインドマウント先をWSL2のUbuntu上のファイルシステムとすることでパフォーマンス問題を回避させる。
- そのため、個別に特定フォルダをvolumeに退避する必要がなく実行できる。
- また、その場合には拡張機能でWSLへ接続後にDev Containersに接続するという2段階の手順が必要になるが、その手間も回避できる。
というものです。
WSL2の設定
- まず、WSL2とUbuntuは通常通りにインストールする。
- この時、Ubuntuのバージョンは22.04を利用するとdockerサービスが自動起動する。
PowerShell
wsl --install Ubuntu-22.04
- また、Ubuntuのデフォルトユーザは
root
とした。- 賛否両論あるかと思うが、dockerコンテナ内でファイルを作成すると、ホスト側のユーザは
root
となってしまうため、最初からホスト側もroot
とした。 - 共有PCとかだと厳しい設定かもしれないが、開発者が扱うPCであれば問題ないと判断した。
- また、エクスプローラーからアクセスする際のユーザも
root
となるため、コンテナ内で編集したファイルも直接扱える。
- 賛否両論あるかと思うが、dockerコンテナ内でファイルを作成すると、ホスト側のユーザは
PowerShell
ubuntu2204 config --default-user root
.devcontainerフォルダの作成
- Terminalなどを立ち上げ、Ubuntu内で作業をする。(
root
ユーザを想定) - 開発に使用するフォルダを作成し、その中へ移動する。
ubuntu
mkdir ~/workspaces
cd ~/workspaces
- 作業フォルダの中に
.devcontainer
フォルダを作成する。- このフォルダ内に
devcontainer.json
を作成することで、VSCodeの拡張機能であるDev Containers
が認識する。
- このフォルダ内に
ubuntu
mkdir .devcontainer
devcontainer.json
{
"name": "dev",
"image": "debian:latest"
}
VSCodeの起動
- 作業フォルダに戻り、VSCodeを起動する。
ubuntu
code .
- VSCodeが起動し、Dev Containersの拡張機能がインストールされていれば、右下に
Reopen in Container
というボタンが表示されるので、そのボタンを押下する。- コマンドパレットから
Dev Containers: Reopen in Container
でも可。
- コマンドパレットから
- すると、VSCodeが再起動し、
devcontainer.json
の内容に従って(初回は時間がかかるが)コンテナが起動する。 - なお、Windows上のVSCodeのアイコンを右クリックすると、フォルダの履歴が表示されてピン止めできるので、次回からはそこから起動すると一発でDev Containersまで接続できて便利。
ベースイメージについて
- 以前からコンテナ開発を行っていたため、必要な開発ツール等が入ったベースイメージを自作している。
- Dev Containersではfeaturesなどで必要な機能を追加することができるが、こちらのベースイメージを利用することで、その手間を省くことができる。
- 最終的にはfeaturesに書けるように分離したいとは思っているが、利便性とのトレードオフかと思う。
- とにかく細かいプロジェクトを同時並行的に扱うため、VSCodeでの環境の切り替えではなく必要なものを一つのコンテナにまとめている。
- そのため、ベースイメージには多くの開発ツールが入っている。
- 一旦、こちらには
devcontainer.json
に拡張機能まで設定したものもありますので、参考までにどうぞ。
最後に
- パフォーマンスについては測定しておりません。(申し訳ございません。)
- ですがファイルをWindowsまで持っていくよりも段違いで速いです。
- また、個別のvolumeを作成するとpnpmを利用している場合には、ボリュームが違うと怒られてしまってpnpmの本来のメリットが活かせない事情もあります。
- なお、紹介しているdevenvironのベースイメージはオープンソースで開発を行っております。
- そのため、不具合や改善点などありましたら、IssueやPRなどお気軽にお願いします。
- また、この記事の内容についても、不明点や改善点などありましたら、コメントなどお気軽にお願いします。