podman設定ファイルの地図
一言でいうと
dockerの設定がdaemon.json1つに集まっているとすれば、podmanは役割ごとに分かれた複数のファイルで、ユーザー別の設定がシステム設定を上書きします。
なぜ必要なのか
dockerから移ってきた人が、最初に迷うのがここです。「レジストリミラーはどこに書くのか」「保存先のパスはどこで変えるのか」。デーモンがないので、daemon.jsonもありません。
どう動くのか
docker podman
────────────────────────── ───────────────────────────────────────
/etc/docker/daemon.json /etc/containers/containers.conf (엔진·런타임 옵션)
~/.config/containers/containers.conf
(레지스트리 미러도 daemon.json) /etc/containers/registries.conf (레지스트리·미러·차단)
~/.config/containers/registries.conf
/etc/containers/storage.conf (스토리지 드라이버·경로)
~/.config/containers/storage.conf
/etc/containers/policy.json (이미지 서명 정책)
~/.docker/config.json (인증) ~/.config/containers/auth.json (레지스트리 인증)
이미지·컨테이너 저장 위치
/var/lib/docker rootful: /var/lib/containers/storage
rootless: ~/.local/share/containers/storage
ユーザー別のファイルが、システムのファイルを上書きします。そのため、rootlessの設定は、たいてい~/.config/containers/の下で行います。
storage.conf
[storage]
driver = "overlay"
runroot = "/run/user/1000/containers"
graphroot = "/home/podster/.local/share/containers/storage"
[storage.options]
additionalimagestores = []
[storage.options.overlay]
mount_program = "/usr/bin/fuse-overlayfs"
graphroot: イメージとコンテナのレイヤーが積み上がる場所です。ディスクを食う主犯です。runroot: 実行中の状態(ロック、一時マウント)です。tmpfsである必要があります。再起動後に残ったロックファイルが、コンテナの起動を妨げる事故を防ぎます。driver: rootlessでは、overlay(+ fuse-overlayfs)かvfsです。vfsは、レイヤーごとに全体をコピーするので、遅く、容量も多く食いますが、どこでも動作します。
registries.conf
unqualified-search-registries = ["docker.io"]
[[registry]]
prefix = "docker.io"
location = "mirror.internal.example.com/dockerhub"
[[registry]]
location = "blocked.example.com"
blocked = true
unqualified-search-registriesがdockerとの代表的な違いです。dockerは、nginxを自動的にdocker.ioとして解釈しますが、podmanは、設定に従うか、どのレジストリなのかを尋ねます。CIのスクリプトなら、最初からdocker.io/library/nginxのように、完全なパスを書くのが、最も堅牢です。
containers.conf
エンジンのデフォルト値を決めます。デフォルトのOCIランタイム(crun/runc)、デフォルトのネットワークバックエンド(netavark/cni)、デフォルトのcgroupマネージャー、デフォルトの環境変数などです。
[engine]
runtime = "crun"
cgroup_manager = "cgroupfs"
[containers]
default_ulimits = ["nofile=65535:65535"]
rootlessで、systemdがなかったり、cgroupの委譲ができなかったりする場合は、cgroup_manager = "cgroupfs"にしておく必要があります。
現場での姿
初期設定のチェックリスト: 新しいサーバーにrootless podmanを立てるときに、確認する順序が決まっています。
- 専用ユーザーとホームがあるか
/etc/subuid、/etc/subgidに、そのユーザーの範囲があるかnewuidmap/newgidmapがインストールされているかgraphrootが、十分な容量のパーティションにあるかrunrootがtmpfsかregistries.confに、社内ミラーとunqualified検索の設定があるかpodman infoで、rootless=true、ドライバー、パスが期待どおりか
7番目が、最終的な検証です。podman info --format jsonをパースして、CIで自動点検するチームも多いです。
次のラボですること
ユーザーpodsterのためのsubuid/subgidを入れ、マッピングを手で計算し、storage.confとregistries.confを作成して、podman infoですべてを検証します。