"BOKU"のITな日常

BOKUが勉強したり、考えたことを頭の整理を兼ねてまとめてます。

コンテナ(Docker)/Kubernetes(k8s)とは何か?と、それらを使うメリットを整理してみた。

f:id:arakan_no_boku:20220328001320p:plain

目次

コンテナとは

VMwareのESXi、LinuxKVMMicrosoftHyper-Vなどのような「仮想マシン」は、OSごと仮想化します。

対して「コンテナ」は他のユーザーから隔離されたアプリケーション実行環境を作り、あたかも個別独立したサーバのように使おうというものです。

仮想化されたアプリケーション実行環境を提供するという点では同じです。

だだ、仮想マシンでは、それぞれにOSを動かす必要がありますが、コンテナは1つのOSで稼働します。

ハードウェアやOSごとの違いはコンテナ管理ソフトウエアが吸収します。

そのため、コンテナ管理ソフトウエアがあれば、他のサーバに移して動かしても確実に動くことが保証されるというメリットもあります。

Kubemetesとは

コンテナ群の運用・管理自動化を行うツールです。

コンテナはひとつの仮想環境内ですべて完結させず、例えば、「Webサーバーコンテナ」「データベースコンテナ」「WordPressコンテナ」みたいに分かれているものを組み合わせてシステムを動かす使い方が推奨です。

当然、結構な数のコンテナを管理・運用することになるので

  • アプリケーションコンテナを運用環境にデプロイする
  • 稼働中のアプリケーションコンテナ数を増減させてスケールする
  • バージョンアップ等で追加機能を提供開始する
  • 各コンテナのハードウェアの利用率を制限して稼働率を高くする

などを効率的にやる必要がでてきます。

この辺の自動化をサポートするが、Kubemetesです。 

コンテナの数の多い大規模システムでのメリットは計り知れないと思います。

20億個ものコンテナを乗せているGoogleみたいに・・。

KubemetesはGoogleが設計したのは、さもありなんです。

www.publickey1.jp

Dockerとは

Dockerは「コンテナ管理ソフトウエア」で圧倒的なシェアを持つソフトウエアです。

さくらのナレッジの記事(https://knowledge.sakura.ad.jp/13265/)の図を引用します。

f:id:arakan_no_boku:20181008153431j:plain

Dockerエンジンが、ゲストOSを動かさずに、ミドルウエア以上を管理するイメージがわかりやすいと思います。

2020/12追記

ドッカーはKubernetes 1.20から非推奨になりました。

arakan-pgm-ai.hatenablog.com

2020/12/03追記

Windows10 HomeエディションではDockerのインストールはできなかったのですが、WSL2(Windows 10 用 Windows Subsystem for Linux2)を使えば、Docker Desktopをインストールできるようになったみたいです。

docs.docker.jp

コンテナを使うメリット

コンテナのメリットでよく書いてあること。

  • 本体をインストールしてあれば、使いたいアプリケーションやミドルウエアが動くイメージファイルをダウンロードしてくれば、即、動かして使える。
  • 仮想マシンと違い、ゲストOSのオーバーヘッドがないので、軽量で高速に動作する。

などなどです。

個人ではそれほど恩恵がないかもしれませんが、企業等で利用するシステムの実運用をベースに考えてみれば、色々とメリットが多いことがわかります。

例えば、こんな点。

  • コンテナの共有によって、メンバ内の開発環境のズレを防止できる。
  • 開発環境で動作確認済の環境を、そのまま本番環境にデプロイできる。
  • アプリケーションのバージョンアップをコンテナを差し替える形で行える。

特に2番目はいいですね。

実際、開発時の各自の動作確認はWindows環境で、本番環境がLinuxというパターンはよくあります。

その場合、開発環境から本番環境にデプロイした時に、同じバージョンのミドルウエアで同じ設定で構築しても、なぜか環境による差異がでて、運用テスト中にあわてて修正する・・なんてことがままあります。

なので、コンテナを使うことで開発・テストを行った環境を、そのまま本番環境にデプロイすることで環境による差異の発生を減らせるなら、保守・運用面では非常に大きなメリットがあります。 

f:id:arakan_no_boku:20181008215853j:plain

 あと、バージョンアップとかの時もそうですね。

開発環境を新バージョンのコンテナにして、十分にテストしたものを、そのまま本番環境にうつして、本番環境の設定の「コンテナ名称」を新バージョンのコンテナに書き換えればバージョンアップリリースができる。

これも、通常手順でシステムを停止して、バージョンアップして、再起動して動作閣員して・・なんてやっている現行手順から見れば、非常に楽でリスクも減らせます。 

企業等で継続的に保守・運用していかないといけないシステムの基盤として考えれば、コンテナ化のメリットは大きなものがあるのは間違いなさそうです。

ではでは。