こんにちは、東京の駆け出しエンジニアwatanabeです。
先月よりエンジニアとして働いていますが、ローカルで開発してきたこれまでの自作開発とくらべて、 仮想コンテナを活用した開発がメインとなっていて慣れるのに苦労しています。
今日は仮装開発環境の土台として動いているDockerを学習しましたので記録として残します。
仮想マシンとは
ソフトウェアを使って1台のPCの中に疑似的に構築されたPCを仮想マシンといいます。 これによって土台となるPCとは異なる環境を手に入れられるので開発がしやすくなったり、物理的な破損の心配がなくなる利点があります。
コンテナ
仮想化技術のひとつにコンテナがあります。Dockerが採用しているタイプです。 従来からあるハイパーバイザ型と比較して、並列実行に向いていて、起動が速くて、動作が軽いことが特徴です。
ハイパーバイザ型とコンテナ型の違い
ハイパーバイザ型はホストPC(土台となる物理マシン)上にハイパーバイザという仮想マシンを構築するソフトウェアを走らせて、その上に仮想マシンを構築します。このとき構築される仮想マシンをゲストPC(単にゲストとも)といいます。 ゲストにはOSが備わっていて、まさに別のマシンがまるっと一台、ホストPC内に構築されるような形になります。
対して、コンテナ型はホストPCを家とすると増改築が自由自在な部屋であると言えます。コンテナ(部屋)の作りはイメージと呼ばれるテンプレートを用いて開発に必要な内容に定型化しておくことが可能です。ハイパーバイザの位置にあたるのはDockerエンジンと呼ばれるソフトウェアが動き、イメージをもとにコンテナを構築します。
たとえの話ですがコンテナの場合は部屋を作るのみのため構築が手軽で目的に特化したVMにし易いです。一方でハイパーバイザ型は家を丸ごと立てるイメージですので構築に時間がかかりますが、隔離性に優れています。
実際に私の業務環境ではローカルマシンからローカルネットワークのハイパーバイザ型仮想マシンに接続して、そこでコンテナを立てて開発していたりします。最初はややこしくて戸惑いました。 使用感としてもハイパーバイザ型のVMは別のマシンを起動するような操作感ですし、そういった運用であるのに対して、コンテナは開発環境のイメージをもとにコマンド一つで立てたり消したり頻繁に繰り返しています。マシンに対する負荷も比較的少ないのでこういった運用ができるのだと思います。
Dockerとは
そもそもDockerとはなんでしょうか?クジラのアイコンが愛くるしいプロダクトですが、そういうことではありません。
Dockerとはいうまでもなくコンテナを実行するソフトウェアを指します。
そもそもコンテナ自体はLinuxで作れるものだったそうなのですが、非常に煩雑で一般化するものではなかったところ、Dockerがコンテナエンジンとして手軽にコンテナ仮想化を提供したことで一気に浸透しました。
いまではデファクトスタンダードではありますが、開発環境で使われることが多く企業の本番環境で用いられることはあまりないそうです 。というのも、企業の本番環境では複数のコンテナを効率よく運用するオーケストレーションツールで運用されていてDockerそのものよりもDocker SwarmやK8sが使用されています。
Dockerコンテナの利点
デプロイが容易
環境の統一ができるようになり、環境差異由来のエラーが減る。結果としてデプロイしやすくなります。
ポータビリティが高い
コンテナイメージを共有すれば同じ環境を構築できます。イメージは軽量なので共有が容易です。
スケーラビリティが高い
コンテナイメージの起動だけで環境が構築されるのでWebサーバーのスケールアウトが容易。
マイクロサービスと親和性が高い
機能ごとにリポジトリをコンポーネント化するマイクロサービスは、特定の環境をスピーディに構築するコンテナ仮想化と相性が抜群です。コンテナ技術のお陰でマイクロサービスを構築できるだけでなく、環境構築が容易なおかげでマイクロサービスのコンポーネントごとに異なる技術をつかうこともできます。
エコシステムが確立している
コンテナ用のイメージファイルですが、これはソフトウェアベンダが自ら配布しています。信頼できる公式が配布しているコンテナイメージを組み合わせてコンテナ構築ができる環境が整っています。
Dockerのデメリット
一方でDockerやコンテナ仮想化のデメリットはあるのでしょうか?
一つはライフサイクルが短いことが悪い面もあるということです。 例えばコンテナはデータの永続性がないため、基本的にコンテナ内で作業したデータは残りません。とはいえ、ホストPCのディレクトリをつかうこともできるのであんまり大きなデメリットでもないです。
もう一つはネットワーク周りがちょっと面倒ということ。
コンテナはホストPCのいちプロセスとして起動おり、ホストPC内で独立して構築されます。このときはホストとは異なるIPがコンテナごとに割り振られます。コンテナはプライベートネットワークであり、外部接続するにはホストPCを介して外部と接続するように事前設定が必要だったりします。
終わりに
つらつら書きましたが、仕事じゃハイパーバイザもコンテナのどっちも仮想化のない環境は想像できないぐらい使ってます。先駆者に感謝ですな。