WindowsでVagrantも、Dockerも動く![WSL2]

一般的なLAMP環境などの開発環境をWindowsで用意する場合、まずはXAMPを使うと思う。

Windowsで動作するApachやPHP、MySQLを内蔵するパッケージソフトで、単にPHPを学んだり、一つのプロジェクトを作るなどであれば、不都合はなく、すぐにPHPを動作することができる。

しかし、業務をこなしていくうえで、様々なOSやPHP、MySQL等ののバージョンだったりの違いが出てきて、誰のマシンでは動作するが、自分の環境では動かない。ローカルでは動くが本番では動かない。などの問題があり、開発環境に仮想化技術が必要になり、VirtualBoxVMWare等が使われるようになった。

そして、仮想環境であるVirtualBoxやVMWareを使うツールとしてVagrantが登場した。

それまで、仮想環境を用意してOSをインストールして、必要なミドルウエアを一つ一つ手入力してと、動かすまでに手間が必要だっが、仮想環境をBOXイメージとして共有、展開できるVagrantや、ミドルウエアであるApacheやPHPなどを自動でインストールしてくれるインフラ構築ツールであるChefなどが出てきて、Vagrant+Chefを使って、仮想環境を構築する技術が出てきた。

私の会社では、2016年ごろからVagrantCehfを使うことで、本番環境と同じ仮想環境を一発で作成できるようにした。
今までの環境構築に丸一日かかってた作業が、ほんの数十分で終わることに感動を覚えた。

が、とにかく動作が重かった。
仮想環境のオーバーヘッドや、Windowsの場合、WindowsとLinuxの仮想環境のファイル共有した部分などがネックになっている模様で、機能が多いサイトになるとなかなかの待ち時間になった。

同時期に、Dockerという技術が台頭してきて、仮想環境ではなく、コンンテナ技術といったもので、PHP+Apach+MySQLなどのコンテナを組み合わせることで、複数のバージョンを切り分けられるので、開発環境として使うことができるというものだった。(このあたりのDockerに関する記事は巷に沢山あるので割愛。)
そして、これらは従来の完全な仮想環境ではなく、それぞれのコンンテナはホストのLinuxカーネルを使うので、動作も高速だった。

が、あたりまえだが、WindowsではLinuxカーネルが無いので動かせなかった

そして、WindowsにWSLという仕組みが導入された。
これはWindowsのカーネルをあれこれしてLinuxカーネルっぽく動かしてLinuxのある程度のコマンドが動くというもの。だけど肝心のDockerがうまく動かない等、何かと問題があった。

そして、WSL2の登場。
WSL1と違い、完全なLinuxカーネルを、Hyper-Vアーキテクチャで再現しているとかで、Linux版のDockerがそのまま動く模様。

これで普通にWindowsでもDockerが使えるようになった。が、Hyper-Vを使ってるので、Vagrantが立ち上がらなくなる問題が解決できていなかった。

そして、Windowsハイパーバイザー プラットフォームが登場

https://atmarkit.itmedia.co.jp/ait/articles/2107/29/news021.html

Windowsハイパーバイザー プラットフォームという機能が登場し、なんか今まではVartualBoxを立ち上げるとハイパーVを占有してしまって、他の仮想化ソフトが使えなくなるみたいな問題が発生していたが、新たにハイパーVを占有してしまわなくてもよいAPIをWindowsが提供することになり、そのAPIを使用したVartualBoxでは占有しないので様々な仮想化ソフトと共有できるらしい。そして、WSL2とも競合しない。

そう、ついにVagrant+Chefの環境とDocker+WSL2の二つの環境が同時に動かせることができるようになった。

これで、過去のレガシーな環境は今まで通りOSレベルで動作を保証するVagrantを使い、新しい開発ではDockerをベースとした開発が可能になる。

というか、どっちも動くので、新しい開発でも、インフラを含め検証したい場合はVagrantを使い、普段のコーディングレベルでの開発はDockerを使うという、美味しいとこどりも可能。

昨今では、Docker環境をそのまま本番で使うAWS ECSなども盛り上がってきているようだが、さくらインターネットが出していたArukasが2年でサービス終了したり、DockerのDocker Enterprise Container Cloudがうまくいかず、Mirantis社に売り払ったり、結局Googleが開発したKubernetestとかいうオープンソースのコンテナ管理ツールがでて、どこのホスティング会社でも作れるようになったりと、本番環境でそのままコンテナを使うサービスは群雄割拠状態に見える。

しかし、高速な開発環境や、今どきの開発者のマシンにはDockerが入っているので、Dockerイメージを配布すれば、OS問わず動くと、本番環境をDockerにしなくても、十分メリットはある。

Docker環境を作っていく

WSL2をインストール

管理者権限でPowerShellを開いて以下のコマンドを実行

*インストールする前にVagrantは完全に落ちている必要があるので再起動後に行ってください

wsl --install

うまくUbuntuが入らない場合は、Microsoft Storeから入れる

ubuntuのユーザー名を決める。Windowsのユーザーとは別の物を指定する必要があるっぽい。

インストールが完了したら、再起動する。

wslコマンド以下のように打ってUbuntuが入っていればOK

アプリのubuntuを開くと、ubuntuのターミナルが起動する

これらは自動的にディスク連携されており、エクスプローラーで\\wsl$\と打てば、Ubuntu側が見れて

Ubuntu側では以下のコマンドでCドライブの中が見れる

cd /mnt/c 

DockerDesktopをインストール

Docker社の出しているDocker Desktop をインストールする。
ある程度の人数の会社での利用や売り上げ規模に応じて有料になるが、小規模であれば無料。

WSL2を使うようにする

インストール完了後に再起動する。

Docker Desktopが起動しなかったので、以下のリンクを参考に

https://qiita.com/toro_ponz/items/d75706a3039f00ba1205

https://qiita.com/Jobchange_pls/items/64bedd8f9673fd5bcf78

AzureADだともうひとくせあったので以下のリンクを参考に

https://karuakun.wordpress.com/2019/04/25/azuread%E3%81%AB%E5%8F%82%E5%8A%A0%E5%BE%8Cdocker-for-desktop%E3%81%8C%E8%B5%B7%E5%8B%95%E3%81%97%E3%81%AA%E3%81%84%E5%A0%B4%E5%90%88%E3%80%81docker-users%E3%81%ABazuread%E3%81%AE%E3%83%A6%E3%83%BC/

Docker Desktopを起動

wslの新しいversionが必要とでたので、wsl --update を実行

無事起動

What is a container? を選択すると、チュートリアルなコンテナが作成される。

うまくbuildさえ動作しない場合、wslのVERSIONがすべて2になってるかを確認

https://www.radical-dreamer.com/programming/wsl-version/

あとは、What is container? と書かれた場所をクリックしたりしてたら、勝手にイメージやコンテナが出来ていれば動作は問題ない。

Dockerの使い方や接続の仕方などは、他のサイトなどに沢山情報があるので割愛する。

Tips

Vagrantが立ち上がらない

Vagrantが立ち上がらなくなったら、Windowsハイパーバイザー プラットフォームが起動してないか、VirtualBoxが古くてハイパーバイザープラットフォームを使ってない可能性がある。

https://inno-tech-life.com/dev/infra/wsl2-with-virtualbox/

wsl2上に置かないと激重

Vagrantでもそうだったが、とにかく仮想環境が重いというより、仮想環境と同期しているフォルダが重い問題。

Dockerでも結局そこは変わらず、Windows上の管理死しているファイルシステム上のソースコードをDocker側で見に行くシステムでは結局激重問題は変わらない。

ソースコードを\\wsl$\Ubuntu\home\{usename}\work\src といった感じで、wslが管理している領域に配置することで、ファイルシステムが同じになり激重問題が解決する。

https://qiita.com/minato-naka/items/84508472c04f628e576e

WSL2上にファイルを移動すると謎のファイル Zone.Identifier ができる

Windows上での管理ファイルらしく、WSL2に持っていくと見えてしまっているものらしい。
Windowsのシステム以外では不要なので、消すか無視リストに入れるかなどで対応。

https://mirumi.tech/wsl2-matome/

ERROR [internal] load metadata for docker.io

ERROR [internal] load metadata for docker.io というエラーがでた。再起動したら直った。
理由が色々あるみたいで原因は分からず。

WSL 環境に git clone したあと fatal: unsafe repository とか言われる

WSL 環境に git clone したあと fatal: unsafe repository とか言われる場合は、知らない場所のリポジトリだけど単に読み込んでいいの?っと注意されてるみたいなので、信頼していると設定を入れる模様。
https://zenn.dev/15/articles/4421263a3df3fa

WSLの権限とDockerの権限が違う

WindowsのWSLで作られたものはWSLインストール時のユーザーで作られるが、Dockerのコンテナで作成されるファイルは基本root権限になる。

そのため、Dockerのコンテナ側で作ったファイルをWindows側のVSCodeなどで編集できない。

そのため、無理やりオーナーや権限を変える方法や、VSCodeでroot権限でコンテナに接続する方法や、Dockerで立ち上げ時にrootでなくWSL側の権限に合わせた権限にするなど、色々やり方はあるが、これが正解!みたいなものはまだ統一されてないっぽい。

https://qiita.com/twu_go/items/a449e3006bd74fc7d10d

https://hatpoppo.com/windows_with_docker_for_knowledge/

だけど、Docker側で作成されたファイル、Dockerのcomposerでインストールされたものを、編集する必要性が思ったよりないかもしれない。

Dockerで生成されている以上、Dockerfileだったり、composerで入れたvendorだったりが多いので、せいぜい自動生成されるconfigなどの設定、接続、環境情報程度なので、それだけDocker側から変更すればいいのでわ?
下手にVSCodeで編集する理由って無いかもしれない。と思いだした。

Windows ターミナル

Windows Store でゲットできるアプリ。

PowerShellやコマンドプロンプト、Ubuntuのターミナルをタブ式で管理できる。

Dockerを使いだすと、PowerShellやUbuntuの窓が増えるのでタスクバーにバラバラ並ぶので分かりにくくなるので、Dockerを使っての開発時はこっちを使う。とか分けると使いやすい。

以上。

参考:
https://chigusa-web.com/blog/wsl2-win11/

Leave a Reply

Your email address will not be published.

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>