こんにちは、イチゴイチエです。

いきなりですが、システム開発をされている皆さんは、どんなOS・環境で開発していますか?
Windows、mac、Linux など、それぞれの良さがありますが、今回は Windows での開発の話になります。

思い起こせば 10年ぐらい昔、Windows のシステム開発環境はなんとなく貧弱な印象があったのですが、昨今は Windows の進化と、仮想化技術の進化、そしてツールの充実により最高の環境が整備されてきています。

それでは、これまでどんな問題があり、それがどう改善されてきたかをご紹介していきます。

Windows でシステム開発する際の問題点

Windows で開発を始める場合、ネット上の記事や動画のおかげで簡単にスタートすることができます。
最初はいいのですが、色々やっていくうちに次のような問題に直面することがあります。

  1. Windows で開発して、Linux 環境にデプロイすると全然動かない
  2. Linux でテストしたいけど、仮想環境を作るのは結構大がかりで大変
  3. PHP のバージョンが新しくなった。でも切り替えが面倒

1.は実行環境の違いや、パーミッション設定が異なっていたり、パス区切りが違うなどが要因として挙げられます。
そこで本番環境に移行させる前に、事前にテストを行いたいというのが 2. になりますが、環境構築で大変になり、だんだん沼にはまっていくケースがあります。
しかもソフトウェアのバージョンがすぐに上がってしまうので、それに付いていかないといけない。
でもアプリ間で違うバージョンを使っていると、手間ばかり増えてなかなか効率よく作業が進みません。

救世主その1:Docker

そこで登場するのが、コンテナ型仮想化ソフトウェアの Docker です。

従来の仮想化技術の「ハイパーバイザ型」と違い、次のような特徴があります。

  1. 起動が早い
  2. メモリ必要量・ストレージ必要量が圧倒的に少ない
  3. あらかじめ必要なソフトウェアがインストールされたイメージを使える
  4. 作っては壊し、がこれまで以上に簡単に行える

起動が早いのは何よりも重要です。ハイパーバイザ型と違い、仮想化ハードウェアとOSの起動を待つ必要はありません。
たとえるならテレビの電源を入れてすぐに映像が映るように、すぐに起動することができます。
その上、メモリやストレージ容量も、従来の仮想化より10分の1程度で済みます。

あらかじめ用意されたイメージをそのまま、または少しアレンジして、すぐに使うことができます。
一つ一つのイメージを単機能のものにしておいて、それを組み合わせて使うとより簡単にサーバーを構成できます。
それらは Docker Hub と呼ばれるライブラリの中に、すべて揃っています。

Windows では、Docker Desktop for Windows をインストールするだけで、すぐにDocker を使うことができます。

Windows 版 Docker の問題点

さて、そんな夢のような技術の Docker ですが、実際の開発で使っていくと次のような課題が出てきます。

「アプリケーションの実行が遅い・・」

Docker により各サービスの起動は瞬時に行われるのですが、PHP、特に Laravel や CakePHPなど巨大なフレームワークを使用したものを実行するとかなりもっさりした動きになります。
CPUよりディスクアクセスが遅い。それはホストOSとDockerコンテナのストレージを同期する際、NTFS と Linuxでファイルシステムが違うことでオーバーヘッドが発生することが問題とのことです。

対策として、ネットで検索するとボリュームマウントを工夫することで同期が早くなるとのこと。
実際にやってみてそれなりに高速化されてしばらくは満足していましたが、同期されないファイルがあることで違ったトラブルが発生していました。

救世主その2:WSL2

そこでこの問題を解決してくれるのが、WSL2。
WSLとは Windows Subsystem for Linux の略で、Windows 上で Linux がそのまま動いてくれるという、驚きのシステムです。
Windows と Linux の統合を図ろうとする Microsoft の野心的なプロダクトですね。

WSL の特徴として、

  1. 仮想化環境で Linux を動かすのと比べて、非常に軽量。起動も速い
  2. Windows とのインテグレーションが秀逸

それがバージョン2となり、

  1. パフォーマンスが向上
  2. 本物の Linuxカーネルが動くようになり、安定性・互換性が向上

といったいいとこずくめのものに進化しています。
WSL2 のインストール手順については、Microsoft 公式から分かりやすいドキュメントが出ていますので、それを参考にしてみてください。

WSL2 で Docker を使う

WSL2 は本物の Linux カーネルが動いているので、Linux と同じように Docker Engine をインストールしてもいいのですが、デーモンの自動起動ができないという問題がありますので、以下の構成でセットアップすると良いと思います。

  1. WSL2 のインストール
  2. 任意のLinux ディストリビューション (私の場合は ubuntu) のインストール
  3. Docker Desktop のインストール。WSL2対応で設定しておくこと
    (Use the WSL 2 based engine、Enable Integration with my default WSL distro)
  4. WSL2 のファイルシステム上で Docker を動かす
    (/home/user/projects など)

特に 4. が重要で、便利だからと思って c/mnt/Users/user などにファイルを置いてしまうと、パフォーマンスは改善されませんのでご注意ください。

WSL2 +Docker がもたらす効果

さぁ、これでモダンな開発環境が構築できました。これを使った場合の効果を上げてみると・・

  • 沢山のシステムの開発・保守をスムーズに行うことができる
    • それぞれ専用のソフトウェアバージョンを使った環境を構築できる
    • 切替えがとても高速
    • アプリの動作が高速
  • Windows と Linux のいいとこどりができる
    • 使い慣れたエディタを使って環境設定ができる
    • rsync, grep, awk, sed など便利な UNIX系ツールを Windowsからそのまま使える
  • 本番環境と開発環境の差が無くなる
    • Dockerコンテナをそのままリリースして稼働させることも可能

基本の開発基盤をしっかりしたものにすることで、より次の新しいことに目を向けることができます。
GitHub を使ったチームでの開発フロー、CI/CDツールを使ったテスト・ビルド・デプロイの自動化、
これらはクラウドネイティブな取り組みを加速させていくことにつながります。

最後に

いかがでしたか? もっとWindows で効率よく開発したい!と思う方に是非オススメします。
株式会社CHEAT では、Docker を使った開発・保守環境を整備し、新しい技術を積極的に取り入れて業務を行っています。
WSL2 や Docker を愛してやまないエンジニアの方がいれば、是非一緒にお仕事ができればと思います!

まとめ

SHARE

RECOMMENDED POSTこの記事もおすすめ!