🐧 Linux 総合学習プラットフォーム
コンテナ Docker/Podman ・ 中級

Podman との関係

Podman は Docker とよく似たコンテナ管理ツールで、RHEL系(MiracleLinux など)で標準的に使われます。コマンドはほぼ互換で、docker を podman に置き換えるだけで動く場面が多く、alias docker=podman として使うこともあります。大きな違いは、Podman は常駐するデーモンを必要とせず、一般ユーザ権限のまま(rootless で)コンテナを動かしやすい点です。学んだ docker の知識はそのまま Podman でも活かせます。

ここまで docker を使って学んできた。ところが現場でRHEL系のLinux(MiracleLinux など)に触れると、標準のコンテナ管理ツールが Podman になっていることがほとんどだ。

新しいツールと聞くと身構えるかもしれないが、心配は要らない。Podman は docker とコマンド体系がそっくりになるよう設計されており、これまで学んだ知識はそのまま活かせるからだ。

💡
ポイントPodman は docker とコマンドがほぼ互換。先頭を podman に置き換えるだけで、学んだ知識がそのまま使える。

大事なのは「docker と何が違い、なぜ RHEL系で好まれるのか」を理解しておくことだ。まずは、どれくらいそっくりなのかを確かめよう。

🔁 学んだコマンドは、どこまでそのまま通じるか

Podman の最大の特徴は、docker とコマンドがほぼ互換だという点だ。これまで打ってきた docker run / docker ps / docker stop / docker rm / docker build / docker logs / docker exec といったコマンドは、先頭を podman に置き換えるだけでそのまま動く。

Docker常駐デーモン(dockerd)ありroot 権限で動くことが多いPodmanデーモンレス(常駐なし)ルートレス(一般ユーザー権限)コマンドはほぼ同じ、中身はデーモンレス・ルートレスで安全

たとえば podman run -d --name web -p 8080:80 nginx でコンテナを起動し、podman ps で確認し、podman stop web で止め、podman rm web で消す、という具合に、操作の流れはまったく同じだ。だから片方を覚えれば、もう片方を新しく覚え直す必要はほとんどない。

▶
例podman run -d --name web -p 8080:80 nginx → podman ps → podman stop web → podman rm web。流れは docker と同じ。

毎回 podman と打つのが面倒で、これまでの癖で docker と打ちたい場合はどうするか。別名(エイリアス)を設定できる。

alias docker=podman を実行しておくと、以降 docker run … と打っても中身は Podman が処理する。確認として docker --version を打って podman version 4.x.x のように返ってくれば、別名が効いている証拠だ。

✓
コツalias docker=podman を実行すると docker と打っても中身は Podman。毎回使うなら ~/.bashrc にこの行を書いておく。

ただしこの alias はターミナルを閉じると消える。毎回使いたいならホームディレクトリの ~/.bashrc にこの行を書いておくと、ログインのたびに自動で設定される。RHEL系では、最初から docker が Podman の別名として用意されている環境もある。

⚙ 裏で常駐するプロセスが無い――それで何が変わるか

では中身は何が違うのか。1つ目の大きな違いがデーモンレスという設計だ。

Docker には、裏で常に動き続ける管理プロセス(デーモン、dockerd)があり、docker コマンドはそのデーモンに指示を出して仕事をさせる仕組みになっている。便利な反面、この常駐プロセスが1つ落ちるとコンテナ操作全体が止まり、しかもそこに権限が集中するため、攻撃の的にもなりやすいという弱点がある。

Podman にはこの常駐デーモンがない。コマンドを打ったときだけ処理が動くシンプルな作りだ。だから、常駐プロセスを狙った攻撃の的が減り、デーモンが落ちて全体が止まるという心配もない。

💡
ポイントPodman はデーモンレス。常駐プロセスが無いので、攻撃の的が減り、デーモンが落ちて全体が止まる心配もない。

🛡 なぜ「一般ユーザーで動かす」ことが安全につながるか

2つ目の、そして安全面で最も重要な違いがルートレスだ。

Docker のデーモンは通常、管理者(root)権限で動いている。これに対して Podman は、管理者でない一般ユーザーの権限のまま(rootless で)コンテナを動かしやすいように作られている。

なぜこれが安全なのか。コンテナはVMに比べて隔離の壁が薄い。だから、万一コンテナの中から外(ホスト)へ抜け出されたとき、コンテナが root 権限で動いていればホストも root として好き放題されかねない。

🔗
たとえコンテナを root で動かすのは家の合鍵を渡すようなもの。ルートレスなら奪われても一般ユーザーの鍵だけで済む。

ルートレスなら、抜け出されても奪えるのはその一般ユーザーの権限だけで、被害を小さく封じ込められる。「最初から低い権限で動かしておく」という、セキュリティの基本(最小権限の原則)をコンテナ運用で実践したものがルートレスだ、と捉えてほしい。

📦 イメージとレジストリの扱いは、どこに差が出るか

イメージの扱いも基本は docker と同じで、podman pull でレジストリから取得し、podman images で一覧し、podman build で Dockerfile からビルドできる。同じ Dockerfile がそのまま使えるので、ビルドの作法も変わらない。

1点知っておきたいのが、レジストリの扱いだ。docker は既定で Docker Hub を見にいくが、Podman は複数のレジストリを設定で扱えるようになっており、RHEL系では Red Hat 公式の registry.access.redhat.com なども使える。

そのため、podman pull したときにどのレジストリから取得するかを確認するよう促されることがある。曖昧さを避けるには、podman pull docker.io/library/nginx のようにレジストリ名まで含めて指定するのが確実だ。

✓
コツpodman でどのレジストリか確認を促されたら、podman pull docker.io/library/nginx のようにレジストリ名まで書くと確実。

🧩 何個ものコンテナを、ひとまとめに動かす

実際のアプリは、Webサーバ・データベース・キャッシュのように複数のコンテナを組み合わせて作ることがほとんどだ。これらを1個ずつ run で起動・連携させるのは大変なので、設定ファイルにまとめて一括で起動する仕組みがある。

Docker では compose.yml に構成を書いて docker compose up で全部まとめて起動できる。Podman 側にも同等の podman compose があって同じ compose.yml を使える。

▶
例docker compose up ……compose.yml に書いた複数コンテナをまとめて起動。Podman では podman compose が同等。

さらに RHEL系では、コンテナを systemd のサービスとして管理し、サーバ起動時に自動でコンテナを立ち上げる、といった運用とも相性がよいのが Podman の強みだ。

🎓 学んだことは、Podman でも無駄にならないか

まとめると、RHEL系(MiracleLinux など)でコンテナを扱うなら、コマンドの使い方はこれまで学んだ docker の知識をそのまま流用できる。その上で Podman は『常駐デーモンを持たず(デーモンレス)、一般ユーザー権限で動かしやすい(ルートレス)』ぶん安全、というのが要点だ。

学習段階では docker と podman の違いを過度に意識する必要はなく、まずは同じ感覚で手を動かして構わない。実務に入って権限やセキュリティ、systemd との連携が問われる場面で、デーモンレス・ルートレスという Podman の設計思想が効いてくる。

docker で身につけたイメージとコンテナの考え方、ボリュームやポート公開の作法は、Podman でもそっくり通用する。ここまでの学びは無駄にならず、そのまま現場で活かせる。

この項目に出てくる用語

Podmanぽっどまん
Docker互換の、デーモン不要なコンテナ管理ツール。
コンテナこんてな
イメージから起動した、実行中のアプリの実体。
イメージいめーじ
アプリと実行環境を固めた読み取り専用の雛形。

関連コマンド

podman

▶ 学習アプリでこの続きを学ぶ・演習する