14 ポイント 投稿者 GN⁺ 2025-09-06 | 8件のコメント | WhatsAppで共有
  • Dockerは バックグラウンドデーモン(dockerd) 構造のため、セキュリティ脆弱性とリソース消費の問題が継続的に指摘されてきた
  • Podmanは デーモンレス構造 を採用しており、コンテナがユーザー権限で直接実行されるため、攻撃対象領域を減らし安定性を高める
  • systemd統合Kubernetesフレンドリーな設計Buildah/SkopeoなどUnix哲学に基づく分離されたツール のサポートにより、運用効率が高い
  • Docker CLIとの高い互換性を維持しており、alias docker=podman だけでも既存ワークフローの大半がそのまま動作する
  • 実運用環境でもセキュリティとリソース管理がシンプルになり、新規プロジェクトではPodmanが より合理的で将来性のある選択肢 になっている

Dockerの限界とセキュリティ問題

  • Dockerは dockerdデーモン が常にroot権限で実行される構造を持つ
    • デーモンの脆弱性が見つかると、ホスト全体が危険にさらされる可能性がある
  • 主なセキュリティ問題の事例
    • 2019: runCコンテナエスケープ(CVE-2019-5736)
    • 2022: Linux Dirty Pipe脆弱性、cgroups v1エスケープ
    • 2024: runC「Leaky Vessels」、BuildKit脆弱性
    • 2024: Docker APIの露出を悪用したクリプトジャッキングキャンペーン
  • こうした事件が繰り返されることで、デーモンベース構造の根本的な危険性 が明らかになった

Podmanのデーモンレス構造

  • Podmanは バックグラウンドデーモンを使用しない
    • podman run 実行時、コンテナはコマンド実行者の 直接の子プロセス として動作する
    • rootlessモードで実行されるため、コンテナ内のroot権限もホスト上では一般ユーザー権限にすぎない
  • 利点
    • セキュリティ強化: コンテナエスケープ時の被害範囲を縮小
    • 安定性の確保: 1つのコンテナが停止しても他のコンテナには影響しない
    • リソース効率: 不要なデーモンが常駐しないためメモリ使用量を削減

Podmanの差別化された機能

  • systemd統合
    • podman generate systemd でsystemdユニットファイルを自動生成
    • 標準の systemctl コマンドでサービス管理が可能
  • Kubernetesフレンドリー
    • Podの概念が標準で組み込まれており、マルチコンテナアプリの開発がしやすい
    • podman generate kube でそのままKubernetes YAMLを生成できる
  • Unix哲学
    • Podmanはコンテナ実行に集中し、イメージビルドは Buildah、レジストリ管理は Skopeo を使用
    • 目的ごとに最適化されたツールを活用できる

移行プロセスと互換性

  • DockerからPodmanへの移行は ほぼ無停止
    • CLIに互換性があるため、docker の代わりに podman をそのまま使える
    • 既存のDockerfileもそのまま動作する
  • 相違点
    • rootlessモードでは1024以下のポートをバインドできない → リバースプロキシを推奨
    • ボリューム権限の管理が必要
    • Dockerソケット依存ツールは、PodmanのDocker API互換モードを利用可能

実務への適用と利点

  • 運用環境でPodmanを使用した結果
    • セキュリティ監査の負担が軽減され、rootlessセキュリティが標準で適用される
    • リソース使用パターンがよりシンプルで予測しやすくなった
  • Dockerは依然として一般的だが、新しいプロジェクトや技術選定の自由度がある場合はPodmanのほうが適している
    • Linux管理体系との自然な統合
    • Kubernetes志向のアーキテクチャ
    • より安全で合理的なコンテナ実行環境を提供

FastAPI移行ガイド要約

  • 既存のDockerfileはそのまま使用可能
  • podman buildpodman run に簡単に置き換えられる
  • podman generate systemd でsystemdサービスを登録
  • Podを活用してDBなどのマルチサービス環境をサポート
  • Docker Composeワークフローは podman-compose または kompose への変換で対応可能

8件のコメント

 
shortstories 2025-09-09

ここでは無停止での移行が可能だと書かれていますが、実際の運用環境では妙な点がいろいろあるんですよね。たとえば mac 環境ではデフォルト設定で zstd 圧縮を使うため、ビルドしたイメージがレジストリをかなり圧迫したりとか..

 
codemasterkimc 2025-09-08

Docker も Podman も……

securityContext:
allowPrivilegeEscalation: false
capabilities:
drop:
- ALL

securityContext:
runAsNonRoot: true
runAsUser: UID

 
koxel 2025-09-08

実際にはDocker互換性があまり良くなくて、使い勝手はそれほど良くありません…。
rootlessを考えてPodmanに移ったものの、結局Dockerに戻ってきました。
他の方の言う通り、Kubernetesで使うなら普通にcontainerdを使えばいいですね。

 
click 2025-09-08

Docker Compose がうまく動かず、Kubernetes 互換性が高いのが利点なら、いっそ最初から Kubernetes を使えばいいのでは、という疑問が湧きますね。
私も使ってみようとしましたが、一発で動かず、1024 未満のポートマッピングも直接できないので、結局 k3s にイメージビルド用の nerdctl を組み合わせて使っています。

 
ndrgrd 2025-09-07

いつか置き換えたい気持ちはあるのですが、以前試してみたときは開発者たちが言うのとは違って、あまりにも多くの docker compose プロジェクトがまともに動かなかったんですよね……

 
afewgoodman 2025-09-07

Dockerのnetworkをサポートしてないじゃん。

 
devsepnine 2025-09-07

Dockerと同様にネットワーク機能もサポートしていると認識していますが、
まだきちんと動かないものがあるのでしょうか?

 
GN⁺ 2025-09-06
Hacker Newsの意見
  • 2001/2002年にWiFiホットスポットボックスを構築する必要があった。当時はOpenBSDファンで、Python製ディストリビューションをできるだけ軽量化したかった。不要なファイルコピーや依存関係の問題を避けたくて、chrootとjailのコンセプトを選んだ。自分のデプロイコードがjail環境の外でソフトウェアを実行し、ptraceでプロセスが開くファイルを監視していた。この出力から依存関係リストを抽出してパッケージ化した。結果として、配布物は小さく、不変性が保たれ、セキュリティも強化された。Dockerが登場したとき、この昔のやり方を思い出したし、実際にDockerコンテナのファイル使用状況を監視して配布物を縮小するような類似ツールがあるのか気になっている
    • 自分が使った中で最高のCI/CDパイプラインは、Djangoのフリーランス案件のデプロイだった。git post-receive hookで、git pushのたびに静的ファイルのビルドとhttpdの再起動を自動化していた。単に git push live master を実行するだけでデプロイできた。Dockerもかなり使ってきたが、これが一番簡単なデプロイだった。Dockerの利点は理解しているが、UbuntuやOpenBSDでHTTP設定をするのはそれほど難しくない。Docker特有の再現性が、本当にそれだけの運用オーバーヘッドを払う価値があるのか疑問だ
    • Google検索の最初の結果に、22kスターのある slimtoolkit/slim がある
    • OpenWrt環境にはujailというツールがあり、ELF実行ファイルを渡すと必要なライブラリ依存関係を解析して、tmpfsに読み取り専用で必要なファイルだけをマウントしてくれる
      関連コードリンク
  • Podmanは自分にとって本当に素晴らしい体験だ。Dockerは使うのが難しく落とし穴も多いと感じたが、Podmanはまったく見劣りしない。何より、所属している会社でライセンスを心配しなくていい。完全にウィンウィンだ
    • 会社でライセンスが心配事だったのか気になる。Docker Desktopの有料ライセンス方針は合理的だ。従業員250人未満または売上1,000万ドル未満なら無料だし、年額$90のライセンス費用も、米国の開発者給与を考えれば昼食代にもならない。しかも公式サポートツールをすべてのOSで使える
    • 実際のところ、会社はライセンスをそれほど気にしなくてもいい。Docker Engineは完全なオープンソースなので無料だ。企業で別途ライセンスが必要なのはDocker Desktopだけだが、機能の大半はDocker Engineで使える
    • PodmanはDockerよりずっと良い。ユーザー/グループ権限の扱いやrootプロセスのセキュリティ問題を心配しなくていいし、デーモンにデータを送る必要もない
    • 一部のPCでは、PodmanのWindowsアンインストーラーがすべてのコンポーネントを正しく削除できず、再実行時にエラーが出る。手動でサービスを削除しても問題が残る。かなり頻繁に起きる苛立たしい点だ
  • Podmanはとても気に入っているが、すべてのコンテナで常にうまく動くわけではない。たとえばgitlabのような大型コンテナは、Dockerの複雑な歴史や癖に依存しているため、podmanではしばしばエラーになる。自作イメージの大半はpodmanで問題なく動くと思う。問題のあるコンテナはincus VMを起動してその中で動かす形で回避している。PodmanもDockerもGPUアクセスの方法が一貫しておらず不便だ。それでもpodmanのほうが少し良いと思う。特にrootlessが大きな利点だ
    • 問題の大半は、PID 1をrootで開始するイメージが原因ではないかと推測する。Podmanはデフォルトでrootlessなので、こうした問題が起きる。Dockerなしでrootベースのイメージも使いたいなら、Podmanをrootfulモードとrootlessモードで分けて用意し、--connection フラグで使いたい環境を指定すればよい。必要ならPodmanが自動でVMも作ってくれる(limaを利用)。Podman DesktopにはDocker互換レイヤーもあり、互換性の問題を緩和してくれる
    • 一部のコンテナがpodmanで動かないという点そのものが、このブログ記事の動機になったのだと思う。利用者層が十分に大きくなれば、公開前にpodman環境もチェックするのが慣行になるだろう
    • 私たちはGitLabサーバーとランナーの両方をpodmanで動かしている。個人的にはランナーをk8sに移したいが、今のところTraefikを使って問題なく動いている
    • buildx関連の機能を多く使っているが、見た目上はpodmanでも動くことになっていても、実際にはうまくいかない
  • Ubuntuでのpodmanサポートが最大の問題だ。Ubuntu標準のpodmanバージョンは古すぎて、そのままでは使えない。私はpodman v5、GitHub Actionsはv3、同僚たちはdockerを使っている。結局、自分のスクリプトを旧版podman、最新版podman、dockerのすべてで動くようにしなければならず、複雑さが増してしまう
    • 信頼できる .deb ビルド配布元がない。公式の .deb はなく、見つかるものもどれも古いか、今後更新しないと言っているところばかりだ。となると、なぜPodmanはインストールをもっと簡単にしないのかという疑問が残る。自分の考えでは、RedHatは競合製品のサポートに開発リソースを割きたくないのだろう。もっともな話ではあるが、RedHatエコシステム外では二級市民のように扱われている印象がある
    • これが最大の問題だと思う。Dockerに比べて知名度が低いことも問題だが、バージョン不一致の問題のほうが、Podmanをニッチな存在にしている主因だ。Ubuntuなどのディストリビューションは古いソフトウェアを提供しがちで、本来はメンテナーが解決すべきだが、Podman側はそこに積極的ではない。このせいで、自分のホームサーバーも最新のPodmanを使うためにRed Hat系へ乗り換えることになった
    • 公式のアップストリーム .deb が継続的に提供されない点が、社内でPodmanを使えない理由になっている。Dockerは公式の .deb リポジトリがきちんと管理されているので、うらやましく感じる
    • Ubuntu/Debianを使わない理由のひとつが、アップデートが遅すぎることだ。flatpakで使うこともできるだろうが、こういうソフトウェアはデフォルトで提供してほしい
    • Podmanはオープンソースなので、Ubuntuのようなところが独自にパッケージ化して更新することもできる。RedHatが競合ソフトのパッケージングまで積極的に支援したがらないのも理解できる
  • 最近、会社の仕事でPodmanのセットアップを経験したが、最悪の体験のひとつだった。rootless Podman+SELinux+コンテナ内の一般ユーザーという組み合わせは本当に地獄だ
    • 苦労しようと思えば何でもできるが、実際にはたいていはうまく動く。SELinuxを有効にしたRHEL10マシンで、nginxリバースプロキシの背後にrootlessコンテナとして複数のサービス(Forgejo、runner、uptime-kumaなど)を問題なく動かしている
    • rootlessの利点を一度も感じたことがない。マシンが単一のセキュリティドメインなら単にrootで動かしても構わないし、そうでないなら本当に隔離された環境(例: Firecracker/Kata VMなど)を使うべきだと思う。rootlessは苦労が多いわりに実益が疑わしい
    • 自分も会社で同じ状況を経験したが、podman流のやり方(docs参照)で解決すれば十分使える。重要なのは、最近のバージョン基準のドキュメントを見ることだ
    • Fedoraで7年以上podmanだけを使っている
    • 私たちの組織はDockerからPodmanへ全面移行したが、途中で多少の問題はあったものの、SysDevチームの力量で無難に解決した
  • Docker Composeワークフローが複雑すぎるなら、そのままKubernetes YAMLに変換しろという話があるが、自分の経験ではK8s YAMLのほうがdocker composeよりはるかに複雑だ。しかも全員がKubernetesを使っているわけではない
    • 私の意見は逆だ。K8s YAMLはdocker composeと複雑さが同程度か、場合によってはむしろ簡単なこともある。ただひたすら冗長なだけだ。100行のcomposeが、50行ずつのYAML 20個に分割されることはある。kubectlに、単純/複雑なYAMLを相互変換するためのsugar機能があればいいのにと思う
    • docker composeをk8s yamlに変換するとき、LLMをレイヤーとして使うと非常にうまくいく。参考までに、podmanにもk8s yaml生成機能があるので、自然に移行できる
    • 私はcomposeファイルは作れないが、k8s yamlは作れる。だからcomposeのほうがむしろ「複雑」に感じる
  • 記事で言及されている podman generate systemd コマンドは、今ではdeprecatedだ。代替としてPodman Quadletsがあり、これはsystemd unitファイルの中に定義するdocker-compose.yamlのような方式だ
    • Compose/オーケストレーションをsystemdに委ねるのは理にかなっている。dockerのようなclient-server構造ではなく、実際のユーザープロセスなのだから、明確に正しい選択だ
    • 問題はドキュメントがほとんどないことだ
  • マルチUIDコンテナを単一のホストユーザーにマッピングするのが難しい。基本的にコンテナ内のrootはホストの実行ユーザーにマッピングされるが、最近は多くのアプリがコンテナ内の非rootユーザー(例: www-data、UID 1000のユーザーなど)を使い始めている。これらはホスト側では補助IDにマッピングされるため、ボリュームマウント時にファイル所有者が孤児化して大きな混乱を招く。すべてのUIDを単一ユーザーにマッピングする簡単なオプションが欲しいが、既存のオプション(crunのuidmap、userns)はうまく動かない。補助IDマッピングの実効性には疑問がある
    • 私の理解が正しければ、これはLinux名前空間の限界だ。DockerやPodmanのようなツールがこうしたマッピングをサポートするには、Linux側のサポートが必要になる。1:1のUIDマッピングが必須なのは、コンテナ内のユーザー1000と0が同じホストユーザーにマッピングされると、ファイル所有者情報が破綻するからだ
    • idmappedマウントを検討してみてもよいかもしれない。これはファイルシステムの再マッピングだけをサポートし、カーネル呼び出しについては解決しない
    • コンテナの中で単に「自分自身」として動作する方法があればいいのにと思う。ログにも所有者がそのまま表示されるような形で
    • ignore_chown_errors オプションを使えば、rootをユーザーIDにマッピングするときに、追加のマッピングなしで比較的簡単に適用できる
  • Podmanへの移行を何度も試みたが、いろいろな点で失敗した。第一に、自分の小型VPSではpodmanの性能がdockerよりかなり悪かった(詳細は省略)。第二に、開発エコシステムが完全には追いついていない。多くのツールがDockerソケットに依存しているが、podmanでは権限問題やAPI互換性の違いのためうまく動かない。podmanは完全なdrop-in代替ではない
    • rootless podman使用時のネットワークの遅さはslirp4netnsが原因かもしれない。pastaのほうが高速な方式だ。Dockerはデフォルトで権限付きデーモンがネットワークを設定するので、もしpodmanをrootユーザーで使うなら性能差はないはずだ
    • podmanやquadletのSELinux権限エラーが相変わらず悩みの種だ。できることなら、ホスト全体の権限を持つpodを作り、必要な /dev だけをマウントして、ごく限定的なプログラムを隔離されたネットワークで公開するほうが簡単だ
    • 面白いことに、自分のリソース不足のシステムではpodmanのほうがdockerより性能もリソース使用量もはるかに優れていた。これはcrunとruncの違いによるものだと思う。そしてpodmanはデーモンがないのでさらに軽い
  • DockerとPodmanをどちらも捨てて、FreeBSD Jailsへ移行した
    • 詳しい情報や管理ツールは こちら
      こちら
      こちら
      こちら で確認できる
    • FreeBSD jailの中でMS SQL Serverや数千個のdockerコンテナを即座に実行できるのか? FreeBSDという選択には大きな代償(互換性の制約など)が伴う。これがjailsが普及しない理由だ
    • セットアップがかなり多そうだが、FreeBSDにもcontainerdのようなものがあるのか気になる
    • FreeBSD jailsはディストリビューション特化の機能だ
    • LinuxホストでVMを動かすのとFreeBSD jailの違いは何なのか気になる