最近、LinuxがDockerからPodmanに向かうわけの記事でPodmanというツールを知りました。
Dockerは日頃使ってますが、「Podmanって何?Dockerと何が違うの?」と思い、雑に調べてみました。
この記事では、
- DockerとPodmanの違い
- Rootlessとは?Dockerでユーザーを作ればいいんじゃないの?
- Dockerのデーモンとプロセスの関係性、その上でのPodmanとの違い
をまとめます!
できるだけやさしく・正確に書いています!
DockerとPodmanの違いとは?
まず最初に押さえておきたいのは、**DockerとPodmanは何が違うのか?**というポイントです。
項目 | Docker | Podman |
---|---|---|
デーモン(常駐プロセス) | 必要(dockerd) | 不要(デーモンレス) |
権限 | 基本Root権限 | Rootlessでも動作可能 |
Kubernetesとの親和性 | 直接連携には工夫が必要 | Kubernetes標準(CRI-O互換) |
systemd連携 | 手動設定が必要 | 自然に連携可能 |
セキュリティ | デーモンがRootなのでリスクあり | 一般ユーザーだけで安全に運用可能 |
Dockerは「簡単にコンテナが使えるツール」として広まりましたが、
常駐デーモン(dockerd)が必要であることが課題とされてきました。
一方、Podmanはデーモンレス・Rootless対応を実現しており、
よりセキュアかつ柔軟なコンテナ管理を目指しています。
Rootlessとは?Dockerでユーザー作ればいいのでは?
Dockerでも、コンテナ内のユーザーを一般ユーザーに設定することはできます。
例えば、Dockerfileでユーザーを追加して切り替えることができます。
FROM ubuntu:22.04
# sudoパッケージをインストール
RUN apt-get update && apt-get install -y sudo \
&& rm -rf /var/lib/apt/lists/*
# 新しいユーザーとグループを作成し、sudo権限を付与
RUN groupadd appgroup && \
useradd -m -g appgroup -s /bin/bash appuser && \
echo 'appuser ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers
# 実行ユーザーを切り替え
USER appuser
# ここから先は"appuser"権限で動作
CMD ["bash"]
ただ、根本的な問題は、dockerd(Dockerのデーモン)がRoot権限で動いていることです。
つまり、コンテナ内のプロセスを制限しても、もし脆弱性があった場合、
ホストごとRoot権限で乗っ取られるリスクは残ります。
一方、PodmanはデフォルトでRootless動作が可能。
コンテナもホストも、最初から一般ユーザー権限なので、
**「壊れても被害を最小限にできる」**設計になっています。
Dockerのデーモンとプロセスの関係性、そこから見るPodmanとの違い
ここで一度、DockerとPodmanのプロセスの仕組みを整理しておきます。
Dockerの場合
-
dockerd
(デーモン)が常にバックグラウンドで常駐している。 - コンテナを作成すると、dockerdがプロセス管理を担当する。
-
docker run
コマンドはCLIクライアントであり、裏でdockerdに「コンテナ作って!」と依頼しているだけ。 - dockerdが落ちると、コンテナ管理も影響を受ける。
図でイメージすると👇
[あなた]
└── docker CLI
└── dockerd(デーモン、常駐)
└── コンテナプロセス
Podmanの場合
-
デーモンレスなので、
podman run
を実行するたびに、その場で直接プロセスが作られる。 - バックグラウンドで親玉のプロセス(デーモン)がいない。
- コンテナはLinuxの通常のプロセスとして独立して動く。
- podmanコマンド自身はすぐ終了し、コンテナプロセスだけが残る。
図でイメージすると👇
[あなた]
└── podman run
└── コンテナプロセス
まとめると
Docker | Podman | |
---|---|---|
常駐デーモン | 必要 | 不要 |
コンテナ管理 | dockerdが担当 | コンテナ自身が独立して存在 |
障害リスク | デーモンに依存するため高い | プロセス単位で独立しているため低い |
この設計思想の違いが、セキュリティや運用柔軟性に大きな差を生んでいます。
(ちなみに、だからこそKubernetesも、いまはPodmanやcontainerdのようなデーモンレス・軽量ランタイムを歓迎する流れになっています!)
最後に
個人的にここを理解したら、
「なんとなくDocker Desktop使ってる状態」から、
「仕組みをわかって使ってる状態」に一段レベルアップできた気がしました!
もしこの先さらに
- Podmanとの違い
- Rootlessコンテナとは?
- Kubernetesとコンテナランタイムの関係
みたいなところにも興味が出たら、ぜひ一緒に深掘りしていきましょう!🚀
(参考)