KubernetesとDockerとの違いについて解説
近年のアプリ開発において、なくてはならない存在になっている「Kubernetes」と「Docker」。
Kubernetesの読み方は諸説あり、「クバネテス」「クバネティス」「クーべネティス」という読み方が主に使われているようです。
KubernetesとDockerはどちらも仮想化・コンテナに関連する技術であり、使ったことはなくても聞いたことくらいならある方は多いと思います。この2つはどのように違うのでしょうか。
一言でいうと、Dockerは「アプリケーションをコンテナに分離するためのツール」、Kubernetesは「コンテナを管理するツール、オーケストレーションツール」だと説明されることが多いです。
しかし、この言葉は抽象的であり、正確に理解するには情報が不足しています。特にKubernetesを利用したことのない方の中には、
「Dockerは使ったことあるけど、Kubernetesは何がメリットなのか分からない」
「チームでKubernetesを導入することになったが、どういった理由で導入されたのかよく分からなかった」
というような疑問を抱いている方も少なくないでしょう。
そこで本記事では、そもそもDockerとは何なのか、Kubernetesとは何なのか、それぞれがどうして必要になってきたのかを解説した上で、両者の違いについて分かりやすく解説します。
コンテナ技術でより効率的にアプリ開発を行いたい方は、是非目を通していただけると幸いです。
【参考】:Docker
【参考】:公式-Kubernetesとは何か?
そもそも仮想化・コンテナとは?
まず初めに、DockerとKubernetesを語る上で必須の知識「仮想化」「コンテナ」について改めて解説させてください。
・仮想化
仮想化とは、アプリケーションが動作する環境を、1つのサーバ内に複数用意する技術のことです。ある1台のサーバの中に複数のサーバを立ち上げ、アプリケーションを動かすことをイメージしてください。
仮想化を行うことで、サーバの余剰リソースが有効活用できる、物理サーバを用意する台数が減る、など様々なメリットを享受することができます。
・コンテナ
さらにその仮想化技術のうち、1つのサーバに立ち上がった複数サーバ間でOSを共有することができるものを「コンテナ」と呼びます。複数サーバを立ち上げる環境そのものを「コンテナ」と呼ぶこともあります。
従来の仮想化では、仮想サーバはそれぞれ独立したOSの上で起動していました。複数のOSが存在することは、それぞれに起動時間がかかることや、サーバリソースが無駄になるという問題点を抱えていました。
それを解決したのがコンテナ技術です。コンテナエンジンがホストOS(=物理サーバのOS)とOS共有しつつ複数のアプリを動かせるため、より高速かつ軽量にアプリケーションを起動することができるようになりました。
仮想化と比較した際に、他にもコンテナ化にはメリットがあります。
・プラットフォーム(Windows/Mac/Linux)によらず、誰でも同じ環境が作れる
・作成した環境を配布しやすい
・スクラップ&ビルドが容易にできる
Dockerとは
ここまでで、コンテナのメリットをお話ししてきました。しかし、アプリケーションをコンテナ化した上で実行するには、少し長い道のりが必要です。
具体的には、下記のような作業が必要です。手間がかかりますが、それぞれの作業でコマンドを何回も実行しなければなりません。
・コマンドやライブラリの取得
・プロセス空間の分離
・ネットワーク空間の分離
・ファイルシステム空間の分離
このコンテナ作成の手間を省くため、コンテナ作成に関わる作業を1つのコマンドラインツールとしてまとめてくれたのが「Docker」です。これにより、コンテナ環境を簡単に構築することができるようになりました。
また、コンテナの実行に必要なパッケージ等をまとめたものを「イメージ」と呼びます。このイメージは「Docker Hub」という共有プラットフォーム上でオンライン共有することが可能です。Docker Hubを利用することで、優秀な開発者が作った使い勝手の良いイメージをすぐ再利用できるようになりました。
Dockerをさらに便利にするDocker-Compose
Dockerによってコンテナ作成は格段に簡単になりました。それでもコンテナ1つにつきそれぞれ「docker build」と「docker run」のコマンドを実行する必要があります。
実際の開発現場では、データベースサーバ用のコンテナやアプリケーションサーバ用、ファイルサーバ用のコンテナが複数立っていることも珍しくありません。ローカル環境開発のために、都度コンテナの数✖︎2のコマンドを実行するのは避けたいところです。
そこで利用すると良いのが「Docker-Compose」コマンドです。開発に必要なコンテナの内容を記載したDockerfileと、それぞれのコンテナの起動設定を記載したdocker-compose.ymlファイルを予め用意してください。その後「docker-compose up」コマンドを叩くだけで、複数コンテナを起動することができます。
Kubernetesとは
DockerやDocker-Composeのコマンドによって、複数のコンテナをたった1コマンドで立ち上げることができるようになりました。仮想化技術がなく、複数アプリの起動に物理サーバが複数必要だった時代から考えると、随分便利になったように思えます。
ただ、Dockerを用いてもアプリの実運用においては課題が残ります。課題の具体例を下記に挙げます。
昨今の大規模アプリ開発では、ディザスタリカバリ(以下、DR)のためにサーバが複数用意されることが当たり前となってきています。DRとは、災害でサーバがダウンした際にユーザがサービスを利用できなくなるのを防ぐ考え方のことです。
DRにおいては、予め同じ用途のサーバを複数用意しておき、メインサーバが天災等の要因でダウンしてしまった場合に、サブとなるサーバを起動しリクエストがそちらに流れるように管理します。
これをコンテナで実現しようとした際、DockerのみではサブとなるコンテナをDockerコマンドを叩いて再起動し、ネットワークに繋げる...など手動による運用が発生します。これも自動化したいところです。
そこで登場するのがKubernetesです。Kubernetesでは専用のYAMLファイルを記述することによって、負荷分散やフェイルオーバーなどコンテナの実運用に必要なさまざまな機能を提供してくれます。具体的には下記です。
・サービスディスカバリーと負荷分散
Kubernetesは、複数のコンテナに対して独自のDNSやIPアドレスを設定できます。リクエストが多い場合はそれぞれのコンテナにトラフィックを振り分けることができます。
・ストレージ オーケストレーション
ローカルのストレージをはじめとして、各種パブリッククラウドが提供するファイルストレージサービスにコンテナをマウントさせることができます。
・自動化されたロールアウトとロールバック
Kubernetesにおけるロールアウトとは、コンテナが取り込むイメージの更新を指します。コンテナの新規作成やバージョンアップによる更新、削除も含めて、サービスを止めることなく自動的に実施することができます。
・自動ビンパッキング
離散数学に「ビンパッキング問題」という考え方があります。「与えられた荷物をどのように箱に詰めれば、必要な箱の数が最小化できるか」という離散数学を大元とする問題のことです。
これをITインフラに置き換えると、「CPUやメモリといったリソースを限られた物理サーバ内でどのように配置するのが最適化か」を考えることに他なりません。Kubernetesの自動ビンパッキングではこれを考慮し、自動的に最適なリソース配置を実現してくれます。
・自己修復
アプリケーションの実運用では、コンテナ上で動いているサーバに対して「生存しているか」を確認する簡単な通信を定期的に送ることがあります。これを「ヘルスチェック」と呼びます。
ヘルスチェックがOKにならないコンテナは復旧作業が必要になりますが、Kubernetesはこの作業を自動化してくれます。処理が失敗したコンテナに対しては、再起動を行ってくれます。
・機密情報と構成管理
パスワードやOAuthトークン、SSHキーのように、コンテナの管理に必要な機密情報をKubernetesは管理してくれます。機密情報の変更の際にコンテナイメージの再作成が不要なので、効率的にアプリの運用ができます。
AWSのKey Management Serviceや、AzureのKey Vaultのようなサービスをイメージして貰えれば良いと思います。
DockerとKubernetesの比較
ここまでDockerとKubernetesという技術が何を解決し、何故必要とされてきたのかを解説してきました。今一度、二つの技術の特徴についてまとめます。
Docker
コンテナ化を簡単に作成・削除できるようにまとめたツールの総称です。予めコンテナの動作に必要なパッケージをまとめてコード化しておくことで、数個のコマンドを実行するだけで高速にコンテナを作れるようになっています。
コード化できることは環境の再配布にも適しており、チーム開発におけるローカル環境の均一化ができるという点でもメリットがあります。
Kubernetes
複数のコンテナを用いてサービスを提供する際の運用上の課題を解決してくれるツールです。ヘルスチェックNGになったコンテナに対して再起動を行う処理や、複数コンテナに対してリソースを適切に配分する処理が自動的に行えます。
2つに優劣はなく、必要になった時に合わせて使うと良い
ここまで述べてきたように、DockerとKubernetesは片方がもう片方の上位互換というものではなく、それぞれに異なったメリット・導入目的があります。
一般的には、サービス提供のために動かす必要のあるDockerコンテナが増えてきたため、それらの運用を自動化したいというニーズが出た時に、Kubernetesが導入されることが多いでしょう。
技術が何故必要になるのかを利用して、効率的にシステム開発しよう
本記事では、コンテナ技術であるDockerとKubernetesがそれぞれ何故必要になるのかを解説した後、2つの技術の違いについて解説しました。
どんな技術にも言えることですが、その技術がどうして必要となったのか、どんな問題を解決できるのかを考えながら導入を進めることが大事です。
この記事があなたの技術選定の判断基準の一つになりましたら幸いです。
編集部オススメコンテンツ
アンドエンジニアへの取材依頼、情報提供などはこちらから