Podmanとは、Dockerと互換性のあるコンテナ実行環境です。Red Hatが開発していることもあり、現在のRHELではDockerのかわりに利用されています。Podmanに対する筆者の理解は
- 基本的にはDockerと同じことができる
- デーモンレスでセキュアらしい
- Red Hatの色が強い(ので、他システムでは積極的に使わなくてもいいや)
程度だったのですが、最近Podmanに触れる機会があったため、改めて秀和システムから刊行されている、Podmanイン・アクションを読んでみました。
目次
Podmanイン・アクションは、「基礎」「設計」「高度なトピック」「コンテナのセキュリティ」の4つのパートで構成されています。以下に目次を引用します。
- Part 1 基礎
- Chapter 1 次世代のコンテナエンジンPodman
- Chapter 2 コマンドライン
- Chapter 3 ボリューム
- Chapter 4 Pod
- Part 2 設計
- Chapter 5 カスタマイズと設定ファイル
- Chapter 6 ルートレスコンテナ
- Part 3 高度なトピック
- Chapter 7 systemdとの統合
- Chapter 8 Kubernetesとの連携
- Chapter 9 サービスとしてのPodman
- Part 4 コンテナのセキュリティ
- Chapter 10 コンテナ隔離におけるセキュリティ
- Chapter 11 その他のセキュリティに関する考慮事項
以下では各チャプターの内容をざっくり紹介します。
Part 1 基礎
Chapter 1 次世代のコンテナエンジンPodman
ここではPodmanとはなにか、その概要や特徴を紹介しています。Dockerと比較した、Podmanの優位性についても一通り解説されています。
そもそもコンテナとは何か、どのような技術を使い、何を実現しているのかのおさらいから始まるため、今までなんとなくDockerを使っていた人も、あらためて読む価値のあるチャプターだと言えるでしょう。
Chapter 2 コマンドライン
podmanコマンドの使い方について解説しているチャプターです。そもそもpodmanコマンドはdockerコマンドと同じことができるため(alias docker=podmanが動作する)、Docker経験者であれば流し読みで十分なチャプターです。
ただしユーザー名前空間に入る「unshare」サブコマンドや、コンテナを作成せずにイメージをマウントする「mount」サブコマンドはPodman固有のため、このあたりは目を通しておくことをお勧めします。
Chapter 3 ボリューム
基本的にコンテナはリードオンリーかつ揮発性であるため、永続的なデータはコンテナ外に分離して保存する必要があります。そこで利用されるのがボリュームです。ここもDocker経験者にとってはお馴染みの概念なので、軽く読み飛ばしてしまってもいいでしょう。
ただしPodmanの特徴でもあるルートレスコンテナを実行する場合は、ユーザー名前空間におけるUIDのマッピングを考慮する必要があるため、その部分の理解は必要になります。
Chapter 4 Pod
Podmanは単体のコンテナだけでなく、k8sでお馴染みとなった概念であるPodを動かすこともできます。そもそもコンテナとは、名前空間とcgroupによって、専用の空間にプロセスを隔離する技術です。そして名前空間やcgroupを共有することで、複数のコンテナを協調動作させるのがPodです。このチャプターではPodの基本的な操作方法を解説しています。
Part 2 設計
Chapter 5 カスタマイズと設定ファイル
このチャプターでは、Podmanの設定ファイルと、そのカスタマイズ方法について解説しています。特にコンテナレジストリ関連は、Dockerが暗黙的にdocker.ioのみを唯一のレジストリとして想定しているのに対し、Podmanは複数のレジストリを利用することを想定しています。短縮名の扱いが少々異なるため、registries.confの扱いなどは覚えておきましょう。
Chapter 6 ルートレスコンテナ
Podmanを使う積極的な理由のひとつが、ルートレスコンテナではないでしょうか。このチャプターではルートレスコンテナがなぜセキュアなのか、それはどのように動作しているのかについて解説しています。本書前半のキモとなるチャプターです。
Part 3 高度なトピック
Chapter 7 systemdとの統合
DockerがコンテナをDockerデーモン自体で管理し、sysmtedの介入を嫌うのに対し、Podmanは積極的にsystemdと協調して動作しようとします。このチャプターでは、コンテナ内でのsystemdの利用、systemdのユニットファイルの簡単な生成方法、ログングドライバとしてのjournaldのメリット、ソケットアクティベーションからのコンテナの実行などを解説しています。
Chapter 8 Kubernetesとの連携
現在、コンテナオーケストレーションシステムとして支配的なのは、なんといってもk8sでしょう。ですが開発者が手元でテストする際には、Dockerを使っているというケースが多いのではないでしょうか。
Podmanは既存のコンテナやPodからk8sのマニフェストを生成したり、逆にk8sのマニフェストからPodを立ち上げることができます。このチャプターでは、こうしたPodmanとk8sとの連携について解説しています。こうしたk8sとの親和性もまた、Podmanを積極的に使う理由のひとつだと言えるでしょう。
Chapter 9 サービスとしてのPodman
DockerはDockerデーモンがREST APIを提供しており、リモートからのリクエストを受け付けることができます。Podmanも同様の機能を備えているものの、デーモンレスで動作するため、何らかの方法でリモートからの接続をリッスンする必要があります。
本チャプターでは、SSH接続を介してsystemdのソケットアクティベーションからPodmanを実行する方法や、クライアントであるpodmanコマンドのリモート接続管理などを解説しています。
Part 4 コンテナのセキュリティ
Chapter 10 コンテナ隔離におけるセキュリティ
現代的なITシステムにおいて、セキュリティの話題は避けて通ることはできません。このチャプターではPodmanにおけるセキュリティについて解説しています。特にLinuxケイパビリティによって、コンテナ内のroot権限を制限する仕組みなどは、きちんと理解しておきましょう。
Chapter 11 その他のセキュリティに関する考慮事項
最後のチャプターでは、さらなるセキュリティに関する情報を取り扱っています。Dockerデーモンに無制限にアクセスできることが何故危険なのか。Podmanではどのように機密情報を取り扱うべきか。またGPGによる電子署名を使い、イメージを検証する方法などを解説しています。
まとめ
筆者はPodmanを「Red Hatのガバナンスが効きまくってる代替品でしょう?」「わざわざ互換品使う理由ある?」と考えていましたが、本書を読んで大きく考え方が変わりました。デーモンレスのfork/exec形式の採用や、ルートレスコンテナの実行は、それだけで乗り換える意味があると思います。また本番環境がk8sであるならば、k8sマニフェストをそのまま理解できるというアドバンテージもあります。その結果、最近では自宅の仮想マシン基盤を、Ubuntu 24.04 + KVM + Podmanで構築してしまった程、親Podman派になってきました。
コンテナの内部的な仕組みやセキュリティについての理解を深めるという点でも、Docker派の人にこそ読んで欲しい、良書だと思います。