こんにちは、みっしぇるです。
今日も勉強したことのアウトプットとして
ブログを更新しようと思いますので、間違えていることが
あったらご指摘いただきたいです。
本日のテーマは、「コンテナ」について。
日経コンピュータの特集であったので読んでみたら、
だいぶ面白かったので、メモしておきます。
読んでみて、簡単に私なりに解釈したところ、
コンテナとは、OS内にアプリケーションレベルで区分けした
「コンテナ」を作成し、その中でアプリの検証・開発をすることができる。
メリット・デメリット、仮想マシンとの違いについては、この跡説明しようと思います。
まずメリットが下記です。
・コンテナ内で独立しており、環境の依存なく、動作することができる。
・CPUやメモリなどのリソースを削減できる。
・起動や急なアクセス増加によるオートスケールが簡単で早い
などが主なメリットです。
・コンテナ内で独立しており、環境の依存なく、動作することができる。
これは、コンテナの大きなメリットで、例えば従来の仮想マシンでアプリを開発した場合、開発環境とテスト環境・本番環境でのライブラリのバージョンが違い、正常に動作しないなどの問題が発生することがあります。(私はインフラしか経験したことないのでわかりませんが・・・)
しかし、コンテナはライブラリのバージョンやJavaのバージョンなどをまとめて「コンテナイメージ」としてその時点の状態をまとめておくことができます。
VMwareで言う、スナップショットと認識しております。
それを利用することにより、開発環境で作成→テスト環境に持ってきてもライブラリのバージョンを気にすることなくデプロイすることができます。
もちろん、クラウドへの移行も簡単にできます。
私の行っていたプロジェクトでもDockerにAnsibleを乗せて、開発環境、本番環境での差異を気にすることなく、動作させていました。
次に、CPUやメモリなどのリソースを削減できることです。
こちらは、後に書く仮想マシンとの違いにも少し触れますが、仮想マシンは、
物理サーバの上にVMwareを置き、その上にLinux/Windows等のOSを立てていくのに対し、
コンテナは、OSの上にアプリケーションレベルでコンテナイメージを作成することができます。
それにより、OSを立て、動作するために必要なリソースなどを削減し、コンテナを動かすためのリソースに限定することができます。
その為、動作したいアプリごとに分け、全体的なリソース・コストの削減することもできるということですね。
最後に起動や急なアクセス増加によるオートスケールが簡単で早いことです。
こちらは二番目でも記載しましたが、アプリケーションレベルで離別するため、本来仮想マシンでかかっていたOSの起動→各アプリケーションの起動をすっ飛ばし、アプリの起動だけを行い、コンテナ起動の時間を大幅に短縮することができます。
どのくらい起動の時間が短縮されるかと言うと
仮想マシン:数分
コンテナ:数百秒
と大幅に短縮できます。
次にオートスケールが簡単という話ですが、もちろんvCenter Serverのようにコンテナを管理するサービスもあり、コンテナ管理サービスを使用することにより、急なアクセス増加により、リソースのしきい値を超えれば、自動的にリソースを足してくれたり、コンテナの数を増やし、負荷分散してくれる事もできます。
KubernetesやAmazon CKS、Amazon ECSなどが主なコンテナ管理サービスです。
デメリットは、下記のとおりです。
・コンテナ毎にIPアドレスが自動で振られてしまう
・Networkに接続する際は、NAT変換を使用する必要がある
・複数ホストでのコンテナ運用が煩雑になる
・コンテナ環境でベースとなるOSとは異なるOSのシステムを動かすことはできない(この記事を書いているときに知りました。。)
・新しい技術で学習コストが高い
などがあります。
1番目はIPアドレスの管理ができないということですね。
※このままの意味だと思うので割愛します。
2番目は、Networkに接続する際は、NAT変換する必要があるということです。サーバ間で通信を行う際、仮想マシンであればOSがIPアドレスを持っているため、そのまま通信を行うことができますが、コンテナの場合、コンテナ自体がIPアドレスを持っているため、一度OSのIPアドレスへNAT変換し、そこからサーバ間の通信をする必要があります。
3番目は複数ホストでのコンテナ運用が煩雑になることです。コンテナは、OS上にコンテナイメージを乗せるため、複数ホストの上にコンテナを乗せるとどのホスト上にどのコンテナを乗せているかを把握しながら運用することになります。
4番目は、コンテナ環境でベースとなるOSとは異なるOSのシステムを動かすことはできないことです。例えば、LinuxにDockerを乗せて、コンテナイメージを作成した場合、そのコンテナイメージをWIndowsに乗せて、システムを動かすことはできません。
5番目は、新しい技術のため、学習コストが高いことです。コンテナは流行りはじめのため、仕組みやノウハウを覚える必要があります。(私の現場でもDockerを使用しましたが、覚えるまでかなりかかりましたし、まだymlを位置から作成することができません。。)新規プロジェクトで、コンテナを初めて導入するとなった場合は、有識者の方がいないとだいぶ厳しいと思います。(個人的な感想)
ちょっと調べが足りなかったところもあると思いますが、補足情報や間違えた箇所などあればご指摘いただけると幸いです。
参考:日経コンピュータ 11/26号
