モダンな開発手法を取り入れることで効果を発揮
Googleには「DevOps Research and Assessment(以下、DORA)」というチームがあり、コンテナの採用を含む、モダンなアプリケーション開発手法を採用している組織のパフォーマンスと採用している技術やプロセス、組織の文化の関係について調査を行っている。
DORAが行った2019年の調査結果によると、モダンなアプリケーション開発手法を取り入れている組織では、以下のようにコードデプロイの速さや、デプロイの失敗、問題発生時の対応速度が向上すると示されている。特に重要なポイントは、コードデプロイの頻度の向上により変化に追従するスピードが上がり、変更による失敗の低さも同時に改善できること。速度と品質を両立しながら改善も可能だという。
ここで強調したいのは、これらの効果は必ずしもコンテナを採用するだけでは実現できるのではなく、CI/CDやテストの自動化、マイクロサービスアーキテクチャの採用など、モダンなアプリケーション開発手法を取り入れているということ。これらの技術とコンテナは親和性が高く、コンテナを採用することでより効果的に実現できる(第2回、第3回で解説する)。
コンテナが普及した背景を技術進歩で振り返る
本シリーズで扱う「コンテナ」という言葉の定義を明確にする目的で、コンテナの歴史を振り返りたい。
コンテナの技術の大元になっているのが、1979年にUnix Version 7に新機能として加えられた「chroot」だ。chrootを利用することで、あるプロセスのファイルアクセスを特定のディレクトリ以下に限定でき、プロセスの脆弱性が悪用された場合に、他のプロセスの脅威とならず、安全に複数のプロセスを一つのOS上で稼働させることが可能となった。
続いてchrootを発展させる形で、IPの付与などネットワークの機能やコンテナとしての管理機能を拡張したFree BSDの「Jail」が2000年に登場。Linuxでのコンテナの実装として「Open VZ」が2005年に登場し、アプリケーションと必要なライブラリを「コンテナ」という単位で管理する概念が生まれた。その後、メモリ、CPUなどのリソースをプロセスグループ単位で制限する「cgroup」が2006年にLinux カーネルにマージされたことにより、コンテナのリソースアロケーションの仕組みが確立し、それを利用したLXC(Linux Container)が 2008年に誕生した。
コンテナ技術における大きな転機になったのが、2013年のDockerの登場だ。それまでのコンテナの技術は環境構築が難しく、アプリケーション開発者だけで使うのが難しい技術であった。しかしDockerにより、アプリケーション開発者が定義ファイル(Dockerfile)を作成するだけでコンテナの作成が可能に。ベースイメージと呼ばれる環境の土台となるイメージはDocker Hubで共有されており、それをベースにDockerfileさえ作成すれば、いつでもどこでも環境を作成できることからコンテナ技術が広まったのだ。
こうしてアプリケーション開発でコンテナ利用が普及したわけだが、商用サービスのアプリケーション基盤として利用するには、どのノードで稼働させるか、ノードの障害時には別のサーバでコンテナを起動し直すのか、リクエストの増減に応じてプロセスを増やしたり減らしたり、などの複雑な管理が必要であった。これを解決するのが、2014 年にオープンソースとして公開された「Kubernetes」である。Kubernetesはコンテナオーケストレーションの仕組みであり、ノードプールと呼ばれるサーバ群に対してDockerコンテナを自動で配置し、ノードの障害時には別のノードでコンテナを再起動するという管理作業を自動化することができる。
Kubernetesの優れている点は、コンテナの配置だけではなく、複数コンテナへの負荷分散を実現しつつサービスへのアクセスを提供するロードバランサーの構成や、サービスの負荷状況に応じてコンテナを増やす/減らすといった、それまでインフラ部門がアプリケーションを稼働させるために行っていたインフラの構成設定についても、アプリケーション開発者自身でYAMLのフォーマットで定義することができる点だ。簡単にアプリケーションをコンテナでデプロイし、サービスとして稼働させる事ができるようになり、さらにコンテナの採用が広がることとなった。
また、cgroupとKubernetesについては、Googleが開発しオープンソースとして公開した技術である。Googleでは2003年ごろから「Borg」と呼ばれるコンテナのアプリケーション実行基盤を独自開発、運用しており、すべてのサービスがコンテナで稼働している。Kubernetesは、このBorgで開発された技術をベースにオープソース化したもので、特に Kubernetesに関してはGoogleが培ってきたコンテナを商用サービスの基盤として利用する際に必要であった機能が実装されている。
なお、本シリーズにおけるコンテナは、DockerコンテナをKubernetesで運用することを想定することとする。