Dockerは知っているけれど、Podmanも試したい・移行したい――そんな人向けの「差分」&「乗り換え」の実践ガイドです。
この記事では、以下のような疑問に答えます。
- PodmanはDockerと何が違うのか
- 既存のDocker環境をどこまでそのまま流用できるのか
-
dockerコマンドに慣れていてもスムーズに移行するにはどうすればよいか - 本番環境で移行するときにどこに気をつければよいか
すでにDockerの基本操作は知っている前提で、**「Dockerとの違い・互換性」と「現実的な移行パターン」**にフォーカスします。
※Podmanそのものの概要やインストール方法は、別記事「Podmanの基本的な使い方ガイド 2025年版」を参照してください。
1. なぜ Docker から Podman を検討するのか
1-1. コンテナランタイムの選択肢が増えた
Docker は「コンテナといえばDocker」という時代を作りましたが、現在は以下のようにコンポーネントが分離してきています。
- コンテナランタイム(runc / crun など)
- イメージ管理・CLI(Docker / Podman / nerdctl など)
- オーケストレーション(Kubernetes / Nomad など)
Podmanはその中で**「Docker互換CLIを持つ、デーモンレスなコンテナエンジン」**というポジションにいます。
1-2. rootless コンテナとセキュリティ
企業利用・マルチユーザーサーバーでは、root権限で動く常駐デーモン(dockerd)がポリシー上NGのケースがあります。
Podmanの特徴:
- デーモン(dockerd)を持たない
- 各ユーザーが自分の権限でコンテナを起動する
- rootless実行が前提として設計されている
つまり、「1台のLinuxを複数の人が使う環境で、各自が安全にコンテナを使う」というユースケースに向いています。
1-3. 既存Docker資産をほぼそのまま活かしたい
Dockerfileやdocker-compose.ymlをすでにたくさん持っている場合、ゼロから書き換えたくはありません。
Podmanは以下の点で、Docker資産を活かしやすい設計になっています。
- Docker互換のCLI(
podman runはほぼdocker runと同じ) - Dockerfileをそのままビルド可能
- docker-compose.ymlを
podman composeで利用可能(※完全互換ではないがかなり近い)
2. CLI互換性と alias docker=podman の是非
2-1. 基本的なコマンドはほぼ同じ
たとえば、Dockerでよく使う以下のようなコマンドは、Podmanでもほぼ同じ構文で動作します。
# Docker
docker run --rm -it alpine:latest sh
docker ps
docker images
docker build -t myapp:latest .
docker logs myapp
docker exec -it myapp bash
# Podman
podman run --rm -it alpine:latest sh
podman ps
podman images
podman build -t myapp:latest .
podman logs myapp
podman exec -it myapp bash
オプションが全く同じではないものの、**日常的に使う範囲では「ほぼコピペで動く」**感覚です。
図: Docker CLI と Podman CLI の互換イメージ
2-2. alias docker=podman はアリか
既存のシェルスクリプトや手が覚えているコマンドを考えると、以下のようなエイリアスを設定したくなります。
alias docker=podman
これは実際に多くの人が使っている方法で、**「手を慣らすフェーズ」**では有効です。
ただし、以下の点に注意してください。
- DockerとPodmanが同一環境に共存している場合、どちらを呼んでいるか混乱しやすい
- 将来的に「Podman固有の機能」を使い始めると、
podmanコマンドを明示したほうが設計上わかりやすくなる
実務的には、
- 初期は
alias docker=podmanで慣れる - チームや本番環境のスクリプトは、早めに
podman明示に揃える
くらいの運用が無難です。
3. Docker と Podman の違い(アーキテクチャ編)
3-1. デーモンの有無
Docker:
- dockerdという常駐デーモンがroot権限で動く
- CLIはdockerdに対してHTTPでAPIリクエストを投げる
Podman:
- デーモンレス(常駐プロセスなし)
- CLIが直接コンテナランタイムを呼び出す(コンテナ単位でプロセスとして存在)
これにより、Podmanでは**「ユーザーごとに完全に分離されたコンテナ環境」**が作りやすくなります。
図: Docker と Podman のアーキテクチャ比較
3-2. イメージストアとコンテナの扱い
概念上は似ていますが、実装は異なります。
- イメージの格納ロケーション
- rootless時のストレージドライバ
- namespace や uid/gid mapping の扱い
などは異なるため、「Dockerと同じディレクトリ構造を前提にした運用」はそのまま持ち込まないほうが安全です。
3-3. ネットワーク周りの違い
Docker:
- デフォルトでDocker独自のbridgeネットワークを作成
-
docker run -p 8080:80でホストにポート公開
Podman(rootlessの場合):
-
slirp4netnsなどを使ったユーザー空間ネットワーク -
-pオプションが利用可能だが、rootless特有の制約がある - 1024番未満のポートを直接開けないなどの制限
rootful Podman(sudo podman)であれば、Dockerに近い動作に寄せることも可能です。
運用ポリシーに応じて
- 開発:rootless Podman
- 本番:rootful Podman または別の構成(systemd+firewalldで制御)
のように使い分けるとよいです。
4. よく使う Docker コマンドとの対応表
Dockerに慣れている人向けに、典型的なコマンドの対応を一覧で整理します。
4-1. コンテナ操作
| やりたいこと | Docker | Podman | 備考 |
|---|---|---|---|
| コンテナ一覧 | docker ps |
podman ps |
-a も同じ |
| コンテナ起動 | docker run ... |
podman run ... |
ほぼ同じ |
| コンテナ停止 | docker stop CONTAINER |
podman stop CONTAINER |
|
| コンテナ削除 | docker rm CONTAINER |
podman rm CONTAINER |
|
| ログ表示 | docker logs CONTAINER |
podman logs CONTAINER |
|
| exec で中に入る | docker exec -it CONTAINER sh |
podman exec -it CONTAINER sh |
4-2. イメージ操作
| やりたいこと | Docker | Podman |
|---|---|---|
| イメージ一覧 | docker images |
podman images |
| イメージ取得(pull) | docker pull IMAGE:TAG |
podman pull IMAGE:TAG |
| イメージ削除 | docker rmi IMAGE |
podman rmi IMAGE |
| ビルド(Dockerfile) | docker build -t NAME . |
podman build -t NAME . |
4-3. 便利コマンド
Podman固有で便利なものとして、次のようなものがあります。
-
podman generate systemd
→ systemdのユニットファイルを自動生成 -
podman generate kube/podman play kube
→ Kubernetes YAML の生成/適用
これらは「移行後にPodmanを活かす」フェーズで効いてきます。
5. volume / network 周りの差分と注意点
5-1. 名前付きボリューム
Docker:
docker volume create mydata
docker run -v mydata:/var/lib/mysql ...
Podman:
podman volume create mydata
podman run -v mydata:/var/lib/mysql ...
構文は同じですが、実際のパスや権限の扱いが異なるため、rootless環境でDBを動かす際は権限やパーミッションをチェックしてください。
5-2. bind mount のパーミッション
-v /host/path:/container/path のようなbind mountでは、
- Dockerではrootが書き込む前提が多い
- Podman rootlessでは、ホスト側のディレクトリ所有者が「ホストユーザー」である必要がある
など、所有者と権限の整合性をきちんと意識する必要があります。
5-3. ネットワークとポート
-
-p 8080:80はどちらも使えるが、rootless Podmanでは1024未満のポートに制限あり - 複数コンテナ間通信は、Podmanのネットワーク(pod)やCNI設定に依存
図: rootless Podman におけるポート公開イメージ
複数コンテナ構成は、後述の podman compose を使うとDockerに近い感覚で管理しやすくなります。
6. Docker Compose → Podman Compose への乗り換え
6-1. podman compose の位置づけ
Podmanには、Docker Compose互換を目指した podman compose サブコマンドがあります。
概念的には、**「docker-composeコマンドのPodman版」**と考えて問題ありません。
典型的な使い方:
podman compose up -d
podman compose down
podman compose ps
6-2. 既存 docker-compose.yml を試す
まずは、既存の docker-compose.yml をそのまま持ってきて試すのがよいです。
# 例:docker-compose.yml をそのまま利用
podman compose up -d
動かしてみて問題が出るのは、主に以下のような箇所です。
- 特殊なネットワーク設定
- volume のマウント(特にrootless)
- Docker独自拡張に依存している部分
6-3. よくある修正ポイント
-
privileged: trueに頼っている部分は、Podman rootlessではそのまま動かない可能性が高い -
/var/run/docker.sockをマウントしているような構成(Docker in Docker的なもの)は設計から見直したほうがよい -
depends_onやヘルスチェックの挙動が微妙に違うことがあるため、起動順序やリトライロジックはアプリ側で持つほうが堅い
7. 実例:シンプルなWeb+DB構成をDocker→Podmanへ移行する
ここでは、非常にシンプルなWebアプリ+DBの構成を例に、
- Docker Composeで動いているものを
- Podman環境に持っていく
という流れを示します。
7-1. もともとの docker-compose.yml(例)
version: "3.9"
services:
web:
build: ./web
ports:
- "8080:80"
depends_on:
- db
db:
image: postgres:16
environment:
POSTGRES_PASSWORD: example
volumes:
- db-data:/var/lib/postgresql/data
volumes:
db-data:
7-2. Podman 環境でそのまま動かしてみる
podman compose up -d
podman compose ps
エラーが出ないか、ログを確認します。
podman logs <webコンテナ>
podman logs <dbコンテナ>
rootless環境でDBのvolumeが権限エラーになる場合は、
- ホストのディレクトリをbind mountに変更
- 所有者を実行ユーザーに揃える
といった調整を行います。
例:
volumes:
db-data:
driver: local
driver_opts:
type: none
o: bind
device: /home/devuser/data/db
図: Web + DB 構成のコンテナ間関係
8. 本番環境で移行するときのチェックリスト
開発環境での動作確認が取れたとしても、本番移行では以下の点を改めて確認してください。
8-1. セキュリティ・権限
- rootlessで運用するか、rootfulで運用するかを方針として決めたか
- コンテナ実行ユーザー(UID/GID)の管理方法を決めたか
- bind mountするディレクトリの所有者・パーミッションは適切か
8-2. ネットワーク・ファイアウォール
- Podmanのネットワーク(CNI)とホストのfirewall(firewalld, nftablesなど)の整合性
- 公開ポート・閉じるポートが明確になっているか
- ロードバランサやリバースプロキシとの組み合わせ設計
8-3. ログ・バックアップ・監視
- ログの保管場所(コンテナ内か、ホストのディレクトリか)
- バックアップ(DB・設定ファイルなど)の取得方法
- 監視(プロセス生存監視・メトリクス)の設計
podman generate systemd を使って systemd のユニットを作成し、
- 起動順序
- 自動再起動
- ログ出力
をOS標準の仕組みで統合すると、Docker時代よりシンプルに運用できるケースも多いです。
9. 移行の進め方(段階的アプローチ)
DockerからPodmanへの移行は、一気にやる必要はありません。
現実的には、以下のような段階を踏むことをおすすめします。
-
開発環境にPodmanを導入
- 個人環境で
podman runを試す -
alias docker=podmanを使って手を慣らす
- 個人環境で
-
CI・テスト環境への導入
-
podman buildでイメージをビルド -
podman composeでテスト用環境を立てる
-
-
一部サービスをPodmanに切り替え
- 影響範囲の小さいサービスから移行
-
podman generate systemdでOSレベルの起動制御に切り替え
-
本番環境の標準ランタイムとして位置付け
- オペレーション手順書をPodman前提で再整備
- 権限管理・監視・バックアップをPodman前提に再設計
図: Docker から Podman への段階的移行ステップ
10. まとめ
-
Podmanは、Docker互換のCLIを持つデーモンレスなコンテナエンジンで、rootless運用やマルチユーザー環境に強みがあります。
-
podman run/podman build/podman composeなど、Dockerユーザーにとって馴染みのあるコマンドがそのまま使えます。 -
ただし、volumeやネットワーク、権限周りの挙動には違いがあるため、本番移行前に必ず確認が必要です。
-
段階的に、
- 個人開発環境
- CI・テスト環境
- 一部本番サービス
- 全体の標準ランタイム
という順に移していくのが現実的です。
関連記事
-
Podmanの基本的な使い方ガイド 2025年版
インストール方法や基本コマンドはこちらで解説しています。