目次
はじめに
システムのインフラ構築でよく話題になるものの一つに、Docker があります。耳にしたことはあっても、具体的にどのようなものなのかはよくわからないという方も多いのではないでしょうか。
Docker をうまく活用するには、Docker と組み合わせて運用することが多い Kubernetes についても知っておく必要があります。
そこで今回は、Docker の概要や特徴とともに、Docker の代表的な管理システムである Kubernetes についてもご説明します。システム環境を構築する際に、ぜひお役立てください。
コンテナサービスとは?
コンテナサービスとは、OS上に隔離されたアプリケーションの実行環境(コンテナ)を作成し、1台のホストマシン上で複数のホストが動いているかのような環境を実現する仮想化技術です。
特徴としては、各コンテナがホストOSを共有して動作するためオーバーヘッドが低く、サーバー起動時や全体的な処理速度が速いことが挙げられます。
コンテナと仮想マシンとの違いについては「コンテナサービスとは?仮想サーバーとの違いを比較」を読んでみてください。
Dockerとは
DockerはDocker社が開発するコンテナエンジンで、アプリケーション実行環境の作成、配布、実行が簡単であることが大きな強みです。
Dockerの構成
Dockerを構成する主な5つの要素をご紹介します。


1.Dockerイメージ
コンテナを立ち上げるために必要なテンプレートを指します。テンプレートの中身はミドルウェアなどの設定やコマンドで、ソフトウェアをインストールする度に必要な初期設定などの手間を省くことができます。
2.コンテナ
Dockerイメージをもとに作られた仮想的なアプリケーション実行環境です。コンテナ内のプロセスはホストOSのプロセスとして実行されます。元々のDockerイメージから再起動した際には初期状態になります。データを永続化させるには、データボリュームなどと組み合わせて使う必要があります。
3.Dockerサーバー
コンテナとDockerイメージを管理するためのサーバーです。
4.Dockerクライアント
利用者がDockerを操作するために必要となるコマンドやツール群のことを指します。
5.Docker Hub(レジストリ)
Dockerのイメージが公開されるレジストリです。利用者はコンテナ経由でDocker Hubにアクセスし、イメージをダウンロードできます。そのため、利用者はサーバーやデータベースの細かい設定を気にすることなく、ソフトウェアの設定や環境構築ができます。
(関連記事:「コンテナレジストリとは?パブリックレジストリとプライベートレジストリの違い」)
Dockerの特徴
同じ環境を共有できる
Dockerは各種環境設定をすべてコード化して管理します。そのコード化されたファイルを共有すれば、あとは読み込むだけで誰でも同じ環境を作れます。Dockerエンジンが稼働しているマシンなら、Docker Hubへアクセスできるので、同じイメージをダウンロードすれば、どのホストサーバでも同じ環境が簡単に作成可能です。
スクラップ&ビルドが容易
コンテナを作るごとに細かい設定を手動で入れていくような煩雑な作業も必要もないので、スクラップ&ビルドが容易にできます。
アプリケーションのデプロイを自動化できる
使うコードが決まることにより、手順も明確化されるのでアプリケーションのデプロイも比較的簡単に自動化が可能です。
複数コンテナを起動できる
Dockerイメージをコピーしてコンテナ名を変更するだけで、複数コンテナを起動できます。クラスタ構成を構築したい場合などには便利です。
上記の特徴は開発環境を構築する際に大変役に立ちます。
例えば、開発メンバー間の環境に違いがあると、ちょっとしたリビジョンの差でも動作が変わってしまいますが、Dockerは同じ環境を共有できるため、開発環境のバージョンのずれを減らせます。
また、開発環境上のコンテナをそのまま本番環境へ移せるので、開発環境と本番環境の差分でトラブルを招いてしまうこともありません。
Kubernetes とは?
Dockerとともによく耳にするものがKubernetesです。Kubernetesとはどのようなもので、活用するとどのような利点があるのか見ていきましょう。
複数のコンテナを1台の実行環境であるかのように扱う
Kubernetesとはオーケストレーションツールの一つで、複数のコンテナを1台の実行環境であるかのように扱えるシステムです。
通常Dockerの実行環境は1台のホストの中で完結しており、ホストの外側とやり取りする場合はNATを経由する必要があります。そのため、ホスト間の連携が煩雑になりがちで、コンテナ数が増えて要求されるリソースが大きくなったときに、簡単にスケールアウトできないことがDockerの難点の一つです。
その点、Kubernetesを利用すると、複数のサーバー上にデプロイされているコンテナクラスタを自動で調整してくれます。現在利用可能なリソースと、配置したいコンテナのリソース要件を加味して、実行するコンテナをスケジュールしてくれるのです。そのためユーザはコンテナを起動する際、イメージと台数を指定するだけでよく、クラスタのどこに配置すればよいかまで検討する必要がありません。


万が一、クラスタのリソース(CPU、メモリ、記憶領域など)が不足した場合でも、単純にノードを増やすだけで、既存サービスに影響を与えることなくいくらでも拡張できるのがKubernetesの強みです。
ユーザが設定した状態を維持するように自動で管理してくれる
Kubernetesは、ユーザが設定した状態を維持するように自動で管理してくれます。つまり運用中のコンテナがサービスダウンした場合でも、Kubernetesが異常を察知してコンテナを自動的に再起動してくれるので、システムが丸ごとダウンすることはあまりありません。
複数のホストで構成されたクラスタで、Kubernetesがコンテナを起動する流れは以下の通りです。オペレーターが直接コンテナを再起動するのではなく、Kubernetes自身がクラスタの状態を調整してくれる仕組みとなっています。
- 最初にユーザがどのようなコンテナを何台起動するか、といった情報を「Spec」としてKubernetesに指示をする。
- Schedulerが空きリソースを見ながら、それらをどのように配置するかを決定する。
- 各ノードに常駐している Kubelet というプログラムが、Scheduler の決定に従ってコンテナを起動する。
以上のように空きリソースを見ながら自動で再起動されるので、個々のコンテナが多少止まってしまってもユーザは気にする必要がありません。
ただし、あくまでも行ってくれるのは再起動だけです。システムが問題なく稼働しているからといって放置しておくと、短期間で頻繁に再起動を繰り返すような大きな障害につながる可能性もあります。
Kubernetesに任せきりにせずに、1日1回は定常監視するなど、モニタリングする体制も整えるようにしておきましょう。
複数コンテナをまとめてデプロイできる
Kubernetesで管理される基本単位はPodです。Podとは、Volumeという記憶領域を共有するコンテナの集まりで、Volumeの他にもう一つ、IPアドレスも共有します。つまりPodはKubernetes上のホストに該当することになります。


ハイパーバイザー型では、1つのホストがデプロイの単位になるため、WebAppサーバーだけ、Webサーバーだけなどと、サーバーごとにデプロイが必要となります。


一方、Docker・Kubernetes環境でマイクロサービス化すれば、WebAppサーバーやWebサーバーなど、サービスに必要な要素をPodとして一括りで構成できるので、まとめてデプロイすることも可能です。
(関連記事:「なぜ今 Kubernetes なのか?」)
おわりに
コンテナサービスの特長をフルに活用するためには、単体で動かす Docker だけでなく、複数のホストで動作させられる Kubernetes を組み合わせて利用することがおすすめです。
スムーズでストレスのないシステム環境を構築するためにも、Kubernetes の特徴を理解したうえで導入を検討してみてください。

Tag: Docker コンテナ Kubernetes
Contactお問い合わせ
お見積もり・ご相談など、お気軽にお問い合わせください。