仮想マシンとDocker


こんにちは、切口太郎です

VS Code Remote Development の拡張機能 VS Code remote Containar を実際に動かして検証しようと思いますが、
「そもそも Docker って何なのよ?」
「Dockerは知っているけど、VMWare なんかの仮想マシンでも良いんじゃない?」
という人も多いと思います。

VS Code の拡張機能から脱線しますが、開発の効率化と環境を開発現場の状況について赤裸々にお話しようと思います。

Dockerについて十分にご存知でしたら、ここは読み飛ばしてください。

「おりゃ、Docker はもう20年ぐらいやっているベテランだから今更、そんなの興味がないな」とおっしゃる方、一応読んでみて下さいね。

1 サービスを稼働させる環境と開発の環境


実際に、開発したプログラムは下図のような商用環境で動作するとします。
サンプルシステム


このような環境で、「機能#3」のプログラムを開発を担当すると想定してください。

同じサーバーの「機能#4」や、別のサーバーの「機能#5」、「機能#6」を意識する必要があります。
それぞれのサーバーの機能は、ライブラリーやフレームワークなど、機能毎に作りやすいものが使われています。
利用するライブラリーやフレームワークは、version の組み合わせが決まっていて異なる組み合わせで利用すると正常に動作しないことがあります。

ローカル環境で分散して開発するためには、これらを利用する開発環境の整備が必要になります。
ライブラリーやフレームワークのバージョンを統一するために、「ライブラリー配信サーバー」を立てて、ライブラリーを常に配信するようにして、統一を取ります。

<br /> <div style="-en-clipboard: true;"> <div> </div> <div> こんにちは、切口太郎です</div> <div> <br /></div> <div> VS Code Remote Development の拡張機能 VS Code remote Containar を実際に動かして検証しようと思いますが、</div> <div> 「そもそも Docker って何なのよ?」</div> <div> 「Dockerは知っているけど、VMWare なんかの仮想マシンでも良いんじゃない?」</div> <div> という人も多いと思います。</div> <div> <br /></div> <div> VS Code の拡張機能から脱線しますが、開発の効率化と環境を開発現場の状況について赤裸々にお話しようと思います。</div> <div> <br /></div> <div> Dockerについて十分にご存知でしたら、ここは読み飛ばしてください。</div> <div> <br /></div> <div> 「おりゃ、Docker はもう20年ぐらいやっているベテランだから今更、そんなの興味がないな」とおっしゃる方、一応読んでみて下さいね。</div> <div> <br /></div> <h2> 1 サービスを稼働させる環境と開発の環境</h2> <div> <br /></div> <div> 実際に、開発したプログラムは下図のような商用環境で動作するとします。</div> <div class="separator" style="clear: both; text-align: center;"> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcrsVhXBe4gKJ3ktR9hqEbq1Nl5hyHXjOgeq1Th4HF6WRyF1aPxz2WgxuDuhO8JW6YklbvNmVGL_JM3UW79R6XwzUEk_5QVyQo-d-_2mvl7rrIL4_cu6FJsulXokL62Rv0Bm19fiBq6R2W/s1600/Image.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="413" data-original-width="788" height="332" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcrsVhXBe4gKJ3ktR9hqEbq1Nl5hyHXjOgeq1Th4HF6WRyF1aPxz2WgxuDuhO8JW6YklbvNmVGL_JM3UW79R6XwzUEk_5QVyQo-d-_2mvl7rrIL4_cu6FJsulXokL62Rv0Bm19fiBq6R2W/s640/Image.png" width="640" /></a></div> <div> <br /></div> <div> <br /></div> <div> このような環境で、「機能#3」のプログラムを開発を担当すると想定してください。</div> <div> <br /></div> <div> 同じサーバーの「機能#4」や、別のサーバーの「機能#5」、「機能#6」を意識する必要があります。</div> <div> それぞれのサーバーの機能は、ライブラリーやフレームワークなど、機能毎に作りやすいものが使われています。</div> <div> 利用するライブラリーやフレームワークは、version の組み合わせが決まっていて異なる組み合わせで利用すると正常に動作しないことがあります。</div> <div> <br /></div> <div> ローカル環境で分散して開発するためには、これらを利用する開発環境の整備が必要になります。</div> <div> ライブラリーやフレームワークのバージョンを統一するために、「ライブラリー配信サーバー」を立てて、ライブラリーを常に配信するようにして、統一を取ります。</div> <div> <br /></div> <div class="separator" style="clear: both; text-align: center;"> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcsGqwlhUROS13UPSnK0MC3VPWuVY6iIfkxFJZ-EdDH5Dv1OmcyKffpCW5OhNamB3jvHKGu_gerDMk4V4U2kJ4vYFnMwYa1osU_SIGNGnv6h939ek8szEGA77rZWGCOUSWdFdSGXjgsr6H/s1600/Image+%255B1%255D.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="523" data-original-width="788" height="424" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcsGqwlhUROS13UPSnK0MC3VPWuVY6iIfkxFJZ-EdDH5Dv1OmcyKffpCW5OhNamB3jvHKGu_gerDMk4V4U2kJ4vYFnMwYa1osU_SIGNGnv6h939ek8szEGA77rZWGCOUSWdFdSGXjgsr6H/s640/Image+%255B1%255D.png" width="640" /></a></div> <div> <br /></div> <h2> 2 開発用サーバーの構築意義</h2> <div> <br /></div> <div> それぞれのサーバーをローカルの中に仮想化環境で構築したりもできますが、開発用のクライアントマシンにこれだけ詰め込むのはさすがにお金かかりすぎでしょう。</div> <div> 仮想サーバーで1個4G設定するとして、20G必要ですからね。</div> <div> 開発マシンは、ノートPCを利用するのが主流ですので、32Gのメモリーを積んだノートPCが必要になります。</div> <div> <br /></div> <div class="separator" style="clear: both; text-align: center;"> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLtXa07CC1rwxt35LJTMPwhTXEF6eBuEMEUBRY7FNvqaFWVw2OpTNzHCpaqKKG4byOPABwl2-nqB8OZpl7nFq3UEBsu3gFt0g-7_k_-ZCcOPl6DjsQMYUGnAVNlxkGl2g3cxzpWDfbsyVv/s1600/Image+%255B2%255D.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="236" data-original-width="776" height="193" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLtXa07CC1rwxt35LJTMPwhTXEF6eBuEMEUBRY7FNvqaFWVw2OpTNzHCpaqKKG4byOPABwl2-nqB8OZpl7nFq3UEBsu3gFt0g-7_k_-ZCcOPl6DjsQMYUGnAVNlxkGl2g3cxzpWDfbsyVv/s640/Image+%255B2%255D.png" width="640" /></a></div> <div> <br /></div> <div> と言うわけで、大体このような環境は、開発用サーバーに設定されて、それが利用グループ毎に割り当てられます。</div> <div> <br /></div> <div> ノートPCには、開発を担当する仮想サーバーをクローン(複製)して利用します。</div> <div> <br /></div> <div class="separator" style="clear: both; text-align: center;"> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdi5yzycxkHwUB8XXgEN3ULKG_VzVSh6M_raW_lA1XLr3qdC83n4HY2OI754L1vHaFhxnRveuk_M3Z6xGyvQGb8Wb8xB4dQBZlusAu6H5ZN5GDsjdx-T6r_ik4nEfwT0tPnMkBfenerhTV/s1600/Image+%255B3%255D.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="423" data-original-width="776" height="347" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdi5yzycxkHwUB8XXgEN3ULKG_VzVSh6M_raW_lA1XLr3qdC83n4HY2OI754L1vHaFhxnRveuk_M3Z6xGyvQGb8Wb8xB4dQBZlusAu6H5ZN5GDsjdx-T6r_ik4nEfwT0tPnMkBfenerhTV/s640/Image+%255B3%255D.png" width="640" /></a></div> <div> <br /></div> <div> <br /></div> <div> 開発中は、この開発サーバーへの常時アクセスが必要なので、どうしても同じLAN内に開発者のPCを設置するので、リモート開発が進まないのかもしれません。</div> <div> <br /></div> <div> 朝、出社すると、GIT から、担当している開発サーバーの最新版ソースを落として、Gradle や Maven で最新版のライブラリーやフレームワークを仮想環境へ落とすという作業をします。</div> <div> 落としている間に、メールをチェックしたりしますが、大人数で作業している場合には、LANがいっぱいになってなかなか作業が進みません。</div> <div> コーヒータイムですね。</div> <div> <br /></div> <div> 最近は、開発サーバーが AWS になっていることが多いので(まだ、自前の会社もかなり多いですが)、状況はかなり改善されています。</div> <div> amazon ありがとう!</div> <div> <br /></div> <div> <div> Dockerが普及するまでは、こんな感じで開発環境を作っていました。</div> </div> <div> <br /></div> <div> 今でもこういう形式でやっているところはかなり多いです。</div> <div> 昔からある開発会社などは、仮想環境を構築しないでクライアントマシンに自分で環境を構築して開発している会社も、かなりあります。</div> <div> <br /></div> <div> さすがに非効率だと思うんですが、まぁ、企業の歴史なんでしょうね。</div> <div> <br /></div> <h2> 3 仮想化環境の利点</h2> <div> <br /></div> <div> 仮想化環境の利点は、商用サーバー(本番機)と、検証用サーバー(テスト機)で、マシンが異なっても全く同じ動作環境を手軽に用意できることです。</div> <div> <br /></div> <div> (前提として、本番機でも仮想化環境が導入されていることが必要です。)</div> <div> <br /></div> <div> <br /></div> <div class="separator" style="clear: both; text-align: center;"> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjN3O0BA0VMfrk8gLDdmSMiObaWCCWFj4qt06ocfv49yuwIN9yQWMGYyZ_7r_UL-kl7JLCatqBbQQgBVuCa5fVjanTyFL9eKeVDtdAO2t2NkZqf6Jogs09_jILjIjSeSI8MdSMeY0jtDKbY/s1600/Image+%255B4%255D.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="216" data-original-width="624" height="219" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjN3O0BA0VMfrk8gLDdmSMiObaWCCWFj4qt06ocfv49yuwIN9yQWMGYyZ_7r_UL-kl7JLCatqBbQQgBVuCa5fVjanTyFL9eKeVDtdAO2t2NkZqf6Jogs09_jILjIjSeSI8MdSMeY0jtDKbY/s640/Image+%255B4%255D.png" width="640" /></a></div> <div> <br /></div> <div> 商用で運用後でも、プログラムの不具合が発覚する事があります。</div> <div> その場合、不具合の内容の確認、原因の特定、プログラムの修正、動作確認などは、本番機と同じ構成のテスト機で行います。</div> <div> <br /></div> <div> その後、障害報告と改修報告を元に、リリースの判定を所有者と行います。</div> <div> 判定結果がGOとなれば、本番機へ修正プログラムをリリースします。</div> <div> <br /></div> <div> 仮想化環境は、本番機とテスト機がハードウエアに依存せずに同様の構成で構築できるため、保守運用時に大きな利点があります。</div> <div> <br /></div> <h2> 4 Docker を利用した開発環境</h2> <div> <br /></div> <div> Dockerを使うとリソース管理が格段に便利になります。</div> <div> <br /></div> <div class="separator" style="clear: both; text-align: center;"> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgy9TrKF4poT7FCguzPUgJQSMINuS7-8TIdZrM8yw8r5WIeWKqVgM6hKZ5-RDh826PSEAan2hQ27oY1mfzg2XjFi5mhLvSQqxFQ9YJeoLFhPiqneSCZVxMBR242iUIESQuT8wKCBSeA_6bu/s1600/Image+%255B5%255D.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="472" data-original-width="725" height="416" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgy9TrKF4poT7FCguzPUgJQSMINuS7-8TIdZrM8yw8r5WIeWKqVgM6hKZ5-RDh826PSEAan2hQ27oY1mfzg2XjFi5mhLvSQqxFQ9YJeoLFhPiqneSCZVxMBR242iUIESQuT8wKCBSeA_6bu/s640/Image+%255B5%255D.png" width="640" /></a></div> <div> <br /></div> <div> <br /></div> <div> Linux 上で動作させれば、仮想化ソフトのように、起動毎にLinux OS が必要ありません。なのでOSで消費するメモリーが必要なくなります。</div> <div> ノートPCでも、すべての機能を可動させることもできます。</div> <div> <br /></div> <div> また、Docker Image に、フレーム必要なフレームワークやライブラリーを設定しておくことで、どの環境でも同一の動作をします。</div> <div> <br /></div> <div> 仮想化環境で、Maven や Gradle などのパッケージ管理ソフトを利用していると、更新は、開発者個人が行うので、環境によって動かいない人が何人か出てきます。</div> <div> Docker であれば、イメージを作成した人が動作確認してれば、どのマシンでコンテナー化しても、ほぼ確実に動作します。</div> <div> <br /></div> <div> Docker イメージの作成担当者も、GIT Hub へ上げる docker image の管理をするだけなので、仮想マシンでの利用者のパッケージ更新にくれべてサポートの手間が現象します。</div> <div> <br /></div> <div> ただ、開発者が実際に操作するローカルPCは、windows が動作しているPCがほとんどです。</div> <div> Windows PC では、Linux 向けに開発された Docker Image が動きません。</div> <div> <br /></div> <div> 結局のところ、Linux が動作する仮想化サーバーとして開発用サーバーが必要になるので、Docker を入れるよりも実績のある仮想化方式で開発を進めるという保守的な状況が続いていました。</div> <div> <br /></div> <h2> 5 Docker for Windows&nbsp;</h2> <div> <br /></div> <div> ついに、Windows10 でも Docker が動作するようになりました。</div> <div> Hyper-V 上で、Docker for Windows 経由で linux 仮想マシンを動作させます。 Linux 仮想マシンで docker&nbsp; engine を動かせば、Docker Container を稼働させる事ができます。</div> <div> <br /></div> <div class="separator" style="clear: both; text-align: center;"> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhnz-HKZZa5pTgiwinM97wPijKD_cEfJ86g9IyfHnFYjMOfOjsl4Lz4HTbX2L76kXMT-50YxknScEx9aV_0duKnqU4J80Q_sSV6-gNnHHMpfjQ3BdRNu70fZPk535bUlKJX0bPS_0EQYxyn/s1600/Image+%255B6%255D.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="598" data-original-width="489" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhnz-HKZZa5pTgiwinM97wPijKD_cEfJ86g9IyfHnFYjMOfOjsl4Lz4HTbX2L76kXMT-50YxknScEx9aV_0duKnqU4J80Q_sSV6-gNnHHMpfjQ3BdRNu70fZPk535bUlKJX0bPS_0EQYxyn/s640/Image+%255B6%255D.png" width="522" /></a></div> <div> <br /></div> <div> Hyper-V は、Windows10 Pro からサポートされている機能なので、Windows で Docker を利用するためには、windows 10 pro のライセンスが必要になります。</div> <div> <br /></div> <div> 個人ではちょっと高いかなと思いますが、企業で支給されている マシンは、ディスク暗号化の Bitlocker がついている windows 10 pro がほとんどです。</div> <div> 会社は、情報漏洩防止のために、windows 10 pro を導入していますが、Hyper-V が使えるので、Docker で開発する人には追加投資がかからなくてとてもラッキーな状態になりました。</div> <div> <br /></div> <div> <br /></div> <div> Windows で Docker が使えるようになったので、これから docker の開発もコストが安くつくので採用が増えていくと思います。</div> <div> 日本の企業は、コストダウン好きですからね。コストダウン案件は、社外でも社内でも進みやすいです。</div> <div> <br /></div> <h2> 6 Docker の利点</h2> <div> <br /></div> <div> 一番の利点は、開発のためのリソースが少なく、管理が楽になることです。</div> <div> 開発者が増えても、それほど管理が複雑になったり、リソース管理にコストが増えるような事はありません。</div> <div> <br /></div> <div> また、実機のへのデプロイも楽になります。</div> <div> Docker には、「コンテナオーケストレーションツール」という実機へデプロイするのを自動化し、実機の動作状況により構成を調整できる機能があります。</div> <div> これは、実際に運用した時に、「想定外の負荷が発生する」ようなケースでは有効です。</div> <div> <br /></div> <div> 仮想化でもCPUを増やす、メモリーを増やす、ネットワークIOを追加する、ディスクを追加するなど、簡単にできますがスケールアップにも限界があります。</div> <div> オーケストレーションを利用すれば、スケールアウトに対応させることができます。</div> <div> <br /></div> <div> <br /></div> <div> 仮想化環境の利点の「テスト機」と「本番機」に分ける運用プロセスは、Dockerを利用しても実現できます。</div> <div> <br /></div> <div> 企業の基幹システムでは、あまり利用されていないようですが、サービス指向のアプリケーションでは dcoker の利用は増えています。</div> <div> <br /></div> <div> <br /></div> <div> Docker これから本格的な旬ですね!</div> <div> <br /></div> </div>

2 開発用サーバーの構築意義


それぞれのサーバーをローカルの中に仮想化環境で構築したりもできますが、開発用のクライアントマシンにこれだけ詰め込むのはさすがにお金かかりすぎでしょう。
仮想サーバーで1個4G設定するとして、20G必要ですからね。
開発マシンは、ノートPCを利用するのが主流ですので、32Gのメモリーを積んだノートPCが必要になります。

サンプルシステムを仮想マシンで実現して開発マシンとして構築

と言うわけで、大体このような環境は、開発用サーバーに設定されて、それが利用グループ毎に割り当てられます。

ノートPCには、開発を担当する仮想サーバーをクローン(複製)して利用します。

開発用サーバーから、開発用クライアントへ環境の複製


開発中は、この開発サーバーへの常時アクセスが必要なので、どうしても同じLAN内に開発者のPCを設置するので、リモート開発が進まないのかもしれません。

朝、出社すると、GIT から、担当している開発サーバーの最新版ソースを落として、Gradle や Maven で最新版のライブラリーやフレームワークを仮想環境へ落とすという作業をします。
落としている間に、メールをチェックしたりしますが、大人数で作業している場合には、LANがいっぱいになってなかなか作業が進みません。
コーヒータイムですね。

最近は、開発サーバーが AWS になっていることが多いので(まだ、自前の会社もかなり多いですが)、状況はかなり改善されています。
amazon ありがとう!

Dockerが普及するまでは、こんな感じで開発環境を作っていました。

今でもこういう形式でやっているところはかなり多いです。
昔からある開発会社などは、仮想環境を構築しないでクライアントマシンに自分で環境を構築して開発している会社も、かなりあります。

さすがに非効率だと思うんですが、まぁ、企業の歴史なんでしょうね。

3 仮想化環境の利点


仮想化環境の利点は、商用サーバー(本番機)と、検証用サーバー(テスト機)で、マシンが異なっても全く同じ動作環境を手軽に用意できることです。

(前提として、本番機でも仮想化環境が導入されていることが必要です。)


リリース後のプログラム改修とリリースの手順

商用で運用後でも、プログラムの不具合が発覚する事があります。
その場合、不具合の内容の確認、原因の特定、プログラムの修正、動作確認などは、本番機と同じ構成のテスト機で行います。

その後、障害報告と改修報告を元に、リリースの判定を所有者と行います。
判定結果がGOとなれば、本番機へ修正プログラムをリリースします。

仮想化環境は、本番機とテスト機がハードウエアに依存せずに同様の構成で構築できるため、保守運用時に大きな利点があります。

4 Docker を利用した開発環境


Dockerを使うとリソース管理が格段に便利になります。

Docker を利用したサンプル環境構成


Linux 上で動作させれば、仮想化ソフトのように、起動毎にLinux OS が必要ありません。なのでOSで消費するメモリーが必要なくなります。
ノートPCでも、すべての機能を可動させることもできます。

また、Docker Image に、フレーム必要なフレームワークやライブラリーを設定しておくことで、どの環境でも同一の動作をします。

仮想化環境で、Maven や Gradle などのパッケージ管理ソフトを利用していると、更新は、開発者個人が行うので、環境によって動かいない人が何人か出てきます。
Docker であれば、イメージを作成した人が動作確認してれば、どのマシンでコンテナー化しても、ほぼ確実に動作します。

Docker イメージの作成担当者も、GIT Hub へ上げる docker image の管理をするだけなので、仮想マシンでの利用者のパッケージ更新にくれべてサポートの手間が現象します。

ただ、開発者が実際に操作するローカルPCは、windows が動作しているPCがほとんどです。
Windows PC では、Linux 向けに開発された Docker Image が動きません。

結局のところ、Linux が動作する仮想化サーバーとして開発用サーバーが必要になるので、Docker を入れるよりも実績のある仮想化方式で開発を進めるという保守的な状況が続いていました。

5 Docker for Windows 


ついに、Windows10 でも Docker が動作するようになりました。
Hyper-V 上で、Docker for Windows 経由で linux 仮想マシンを動作させます。 Linux 仮想マシンで docker  engine を動かせば、Docker Container を稼働させる事ができます。

er for Windows を利用したサンプルシステム環境の構築

Hyper-V は、Windows10 Pro からサポートされている機能なので、Windows で Docker を利用するためには、windows 10 pro のライセンスが必要になります。

個人ではちょっと高いかなと思いますが、企業で支給されている マシンは、ディスク暗号化の Bitlocker がついている windows 10 pro がほとんどです。
会社は、情報漏洩防止のために、windows 10 pro を導入していますが、Hyper-V が使えるので、Docker で開発する人には追加投資がかからなくてとてもラッキーな状態になりました。


Windows で Docker が使えるようになったので、これから docker の開発もコストが安くつくので採用が増えていくと思います。
日本の企業は、コストダウン好きですからね。コストダウン案件は、社外でも社内でも進みやすいです。

6 Docker の利点


一番の利点は、開発のためのリソースが少なく、管理が楽になることです。
開発者が増えても、それほど管理が複雑になったり、リソース管理にコストが増えるような事はありません。

また、実機のへのデプロイも楽になります。
Docker には、「コンテナオーケストレーションツール」という実機へデプロイするのを自動化し、実機の動作状況により構成を調整できる機能があります。
これは、実際に運用した時に、「想定外の負荷が発生する」ようなケースでは有効です。

仮想化でもCPUを増やす、メモリーを増やす、ネットワークIOを追加する、ディスクを追加するなど、簡単にできますがスケールアップにも限界があります。
オーケストレーションを利用すれば、スケールアウトに対応させることができます。


仮想化環境の利点の「テスト機」と「本番機」に分ける運用プロセスは、Dockerを利用しても実現できます。

企業の基幹システムでは、あまり利用されていないようですが、サービス指向のアプリケーションでは dcoker の利用は増えています。


Docker これから本格的な旬ですね!

コメント

このブログの人気の投稿

Hyper-V で Docker Desktop for Windows を使う(その2)

Python の命名規約 - ネーミングルール

VS Code で Hyper-V + Docker Desktop for Windows