Windows 11 + Docker + Linux開発の落とし穴

こんにちは。デザイン・システム室の濱口です。
私は昨年、未経験から入社し、現在は弊社のサービス「ミールタイム」や社内向けのシステム開発に携わっています。普段はWindows 11を使って開発をしていますが、Dockerを使って開発を行う際に、Windows、Docker、Linuxの関係性を深く理解することができず、苦労しました。今回は、その過程で得た知識をまとめたいと思います。

WindowsでDockerを使う場合

Dockerの公式ページからDocker Desktopをダウンロードし、Windows上でDockerを使用し開発を進めるには注意が必要です。その理由としては、DockerがLinuxカーネルの機能に大きく依存しているからです。基本的にはDockerはLinux上で起動させるのが理想的です。

Windows上にはWSL(Windows上で動作するLinuxの実行環境のこと)が備わっているため、動作はします。しかし、このWSLはLinuxではなく、LXCoreというサブシステムがLinuxの実行環境を作っています。この状態でDockerを動かすと、WindowsとLinuxではファイルシステム(ファイルの保存形式のようなもの)が異なるため、すべてのファイルをLinux用に変換する必要があり、その結果処理が遅くなります。ファイル数が少ない場合はそこまで影響はありませんが、ファイル数が多い場合はこの処理に時間がかかることで開発に大きな影響を及ぼします。

Windows Subsystem for Linux2(WSL2)の存在

ここで重要になるのがWSL2の存在です。WSL2へのアップデートにより、Windows上でLinuxを動かすことが可能になります。つまり、Windowsにインストールされているソフトウエアの1つのようにLinuxを使用できます。これにより、仮想化でLinux上でDockerを起動させることにより、変換処理がなくなり読み込みが速くなります。

では、この問題を解決する流れをまとめてみましょう。

今回は、簡単に3ステップに分けて進めていきます。

  • WSL2へのアップデートとLinuxディストリビューションのインストール
  • DockerでWSL2の設定
  • 開発フォルダーをディストリビューションの領域内に配置

WSL2アップデートとLinuxディストリビューションのインストール

WSL2は2019年6月に発表され、その内容はWSLよりもパフォーマンスが向上し、最適化によりWindows上でより優れたLinux体験ができるようになりました。(Hyper-Vと呼ばれるハイパーバイザー上でLinuxカーネルが動作するようになります)

また、Linuxディストリビューションとは、Linuxカーネルを含めたアプリケーションなどをパッケージ化してすぐに使える状態にしたものを指します。Ubuntu、Debian、CentOSのように多様なディストリビューションがあります。両者の関係性では、WSL2が基盤でLinuxディストリビューションが建物のようなイメージです。

ここでは詳しい設定方法などは省略しますが、以下のように設定ができていれば問題ありません。

[C:\Users\hamaguchi] PS > wsl --status
既定のディストリビューション: Ubuntu
既定のバージョン: 2

※これでLinuxディストリビューションがUbuntuとWSLのバージョンが2であることを表示してます。

[C:\Users\hamaguchi] PS > wsl -l -v
  NAME                   STATE           VERSION
* Ubuntu                 Running         2
  docker-desktop         Running         2
  docker-desktop-data    Running         2

※今回私はUbuntuをディストリビューションとして選択しました。無事に動作しています。

これによりWindows上でLinuxを起動させる準備が整いました。

DockerでWSL2の設定

WSL2へのアップデート及びディストリビューションの設定後はDockerの設定になります。

DockerとWSL2を連携させてLinux環境で起動させるように設定をします。

Docker Desktopを開いて、Settings/General/Use the WSL 2 based engine にチェック

続いて、Settings/Resources/WSL integrationのUbuntuのトグルをONにする

※この設定によりPowershell及びUbuntuの両サイドのターミナルでDockerを使えるようになります。

docker -v

両方のターミナルで入力してみると同じDockerのバージョンが確認できるはずです。

開発フォルダーをディストリビューションの領域内に配置

最後にLinuxディストリビューションに開発したいフォルダーを配置して完了となります。

私が選んだUbuntuだと、エクスプローラーより\\wsl$\Ubuntu\home\{ユーザ名}\projects\の直下に

フォルダーを設定しています。(インストールしたディストリビューション領域内に配置することが重要です)

ローカル環境にあるDockerで使いたいアプリケーションをコピーして移動させるか、GitよりクローンしてDockerを起動させてみましょう。

まとめ

今回は簡単に3ステップに分けて、まとめてみました。

  • WSL2へのアップデートとLinuxディストリビューションのインストール
  • DockerでWSL2の設定
  • アプリコードをディストリビューションの領域内に配置

これらの設定によりWindows上でLinuxを使いDockerを起動させることが出来るようになりました。

また変換処理もなくなり、効率よく開発を進めることが出来ます。

参考文献

さいごに

現在デザイン・システム室では、新しいメンバーを募集しています。                少しでも興味を持たれた方は、ぜひご応募ください。
皆様からのご応募、心よりお待ちしております。