Dockerだけではない: Podman、LXD、ZeroVMを含む主要なコンテナ技術を探る
最近では開発環境をローカルに構築することなく、Dockerをはじめとするコンテナ技術を使用する場面が増えています。コンテナ技術の利用により、環境の構築手間が大幅に軽減でき、さらにプログラミング言語やデータベースのバージョン管理も柔軟に行えるのが主な利点として挙げられます。
そんなコンテナ技術で有名なものとしてはDockerが存在しますが、最近では他にもさまざまなコンテナ技術や仮想化技術が登場しています。本記事では、 これらの技術の相違点や特徴について紹介します。
コンテナとは
コンテナはホストOSから独立した環境でアプリケーションを実行する技術です。
Dockerの場合を見てみると、下の図のようにホストOSの上にDockerが存在し、このDockerが様々なアプリケーションを「コンテナ」として管理しているとイメージできます。

具体的には、コンテナ内には必要なライブラリや依存関係がパッケージ化されており、これによりアプリケーションの実行環境が均一化されます。Dockerの場合、基本的に1プロセス = 1コンテナとして動作します。
サーバー上では、通常、HTTPサーバーやアプリケーション、データベースなど が混在して動作しています。これらが複数のプロセスとしてサーバー上で実行されているため、もしセキュリティリスクがあるソフトウェアがあった場合、それがシステム全体の脆弱性となることが考えられます。
コンテナ技術を利用すると、各プロセスが独立した環境で動作するため、セキュリティリスクを局所的に抑えることができます。さらに、異なるバージョンのデータベースを同時に動作させることや、アプリケーションごとに異なるプログラミング言語のバージョンを使用することも容易になります。
さまざまなコンテナランタイム
Docker社がDocker Desktopを有償化したのは記憶している方も多いでしょう。その結果、Dockerに代わるコンテナランタイムが増えてきました。この動きの背景として、OCI (Open Container Initiative) というプロジェクトが進められたこともあります。これはコンテナ形式とランタイム仕様を標準化するプロジェクトです。
Dockerの背後にある技術として、containerdというコンテナランタイムが存在します。containerdはさらに低レベルな部分でruncというランタイムを採用しています。runcは、コンテナイメージの管理と低レベルランタイムの呼び出しを担当するするコンポーネントで、Go言語で実装されています。
