podmanコマンドの使い方|DockerからPodmanへの移行方法とRHEL9対応の実践例

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)Linuxtips > podmanコマンドの使い方|DockerからPodmanへの移行方法とRHEL9対応の実践例
「Dockerは使えるが、RHEL9ではDockerが非推奨になった。Podmanに移行したいが、コマンドの違いや設定方法がわからない」
そんな悩みを抱えるサーバー管理者は多い。

RedHat Enterprise Linux 8以降、Dockerはデフォルトリポジトリから削除され、代わりにPodmanが標準のコンテナランタイムとして採用された。
RHEL9・Rocky Linux 9・AlmaLinux 9を使う現場では、Podmanの習得はもはや必須スキルになっている。

この記事では、podmanコマンドの基本的な使い方から、Dockerとの違い、移行手順、rootlessコンテナの設定まで実践的に解説する。
動作確認環境:RHEL 9.4 / Rocky Linux 9.4 / Ubuntu 24.04 LTS

この記事のポイント

・podmanコマンドはDockerと同じ構文で使えるため移行コストが低い
・rootlessモードでデーモンレス動作するためセキュリティリスクが小さい
・docker→podmanのエイリアス設定でスクリプト移行を最小化できる
・podman-composeでdocker-compose.ymlをそのまま流用できる


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
図解60P/登録10秒/解除も3秒 / 詳細はこちら

podmanとは|Dockerとの根本的な違い

podmanは、Red Hatが開発したデーモンレスのコンテナ管理ツールだ。
Dockerと大きく異なる点は2つある。

デーモンレス:Dockerは常駐プロセス(dockerd)が必要だが、podmanはデーモン不要
rootless対応:一般ユーザー権限でコンテナを実行できる

Dockerは dockerd というデーモンプロセスが常時起動し、すべてのコンテナ操作はこのデーモン経由で行われる。
デーモンがrootで動くため、コンテナ経由のホストへの権限昇格リスクが存在する。

podmanはこの設計を根本から変え、コンテナプロセスを直接forkする方式を採用した。
rootユーザーでも一般ユーザーでも同じコマンドで操作できる。

項目 Docker Podman
デーモン 必要(dockerd) 不要
rootless動作 制限あり 完全対応
コマンド互換性 ほぼ同一
docker-composeの代替 docker-compose podman-compose
RHEL9でのサポート 非推奨 標準搭載

podmanのインストール方法|RHEL9・Rocky Linux・Ubuntuに対応

1. RHEL 9 / Rocky Linux 9 / AlmaLinux 9 へのインストール

RHEL9系では、podmanはデフォルトリポジトリに含まれている。

# podmanをインストール # dnf install -y podman # バージョン確認 # podman --version podman version 4.9.4-rhel

2. Ubuntu 24.04 LTS へのインストール

# パッケージリストを更新してpodmanをインストール $ sudo apt-get update $ sudo apt-get install -y podman # バージョン確認 $ podman --version podman version 4.9.3

3. インストール後の動作確認

# hello-worldコンテナで動作確認 $ podman run hello-world Resolved "hello-world" as an alias (/etc/containers/registries.conf.d/000-shortnames.conf) Trying to pull docker.io/library/hello-world:latest... Getting image source signatures Hello from Docker! This message shows that your installation appears to be working correctly.

podmanの基本コマンド|Dockerと対応する操作一覧

1. イメージの取得と確認

# イメージを取得する(pull) # podman pull docker.io/library/nginx:latest # ローカルのイメージ一覧を表示する # podman images REPOSITORY TAG IMAGE ID CREATED SIZE docker.io/library/nginx latest a72860cb95fd 2 weeks ago 192 MB docker.io/library/hello-world latest d2c94e258dcb 13 months ago 25.4 kB

2. コンテナの起動と確認

# コンテナをバックグラウンドで起動する(-d: デタッチモード, -p: ポートマッピング) # podman run -d -p 8080:80 --name my-nginx nginx:latest 3f8a9d2c1b4e7f0a8c3d2e1f9b4a7c0d8e3f1b4a7c # 起動中のコンテナを確認する # podman ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3f8a9d2c1b4e docker.io/library/nginx:latest nginx -g daemon o... 5 seconds ago Up 5 seconds 0.0.0.0:8080->80/tcp my-nginx # すべてのコンテナ(停止中を含む)を確認する # podman ps -a

3. コンテナの操作

# コンテナを停止する # podman stop my-nginx # コンテナを再起動する # podman restart my-nginx # コンテナを削除する(停止後に実行) # podman rm my-nginx # 起動中のコンテナを強制削除する # podman rm -f my-nginx # イメージを削除する # podman rmi docker.io/library/nginx:latest

4. コンテナ内でコマンドを実行する

# 起動中のコンテナにbashで入る # podman exec -it my-nginx bash # 起動中のコンテナで単発コマンドを実行する # podman exec my-nginx cat /etc/nginx/nginx.conf # コンテナのログを確認する # podman logs my-nginx # リアルタイムでログを追跡する # podman logs -f my-nginx

DockerからPodmanへの移行方法|エイリアスで互換性を保つ

1. docker→podmanエイリアスの設定

podmanの最大の強みは、Dockerとコマンド構文がほぼ同じ点だ。
エイリアスを設定すれば、既存のスクリプトを修正せずにpodmanで動かせる。

# ~/.bashrcにエイリアスを追加する $ echo "alias docker=podman" >> ~/.bashrc $ source ~/.bashrc # または、dockerコマンドのシンボリックリンクを作成する(root権限が必要) # ln -s /usr/bin/podman /usr/local/bin/docker

RHEL9系では podman-docker パッケージが提供されており、インストールすると docker コマンドを呼ぶと自動的にpodmanが実行される。

# podman-dockerパッケージをインストールする # dnf install -y podman-docker # インストール後、dockerコマンドを実行するとpodmanが動く # docker run hello-world Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg. Hello from Docker!

2. 既存スクリプトの移行確認

Dockerスクリプトをpodmanで動かす場合、以下の点を確認する。

Dockerソケット参照:/var/run/docker.sock を参照するスクリプトは修正が必要
docker-compose:podman-composeに置き換えるか、後述のpodman generate systemdを使う
Dockerfile:そのままpodman buildで使える

# Dockerfileからイメージをビルドする # podman build -t my-app:latest . # ビルドしたイメージを確認する # podman images my-app REPOSITORY TAG IMAGE ID CREATED SIZE localhost/my-app latest 8f3c2a1d9e4b 2 minutes ago 345 MB

podman-composeの使い方|docker-compose.ymlを流用する

1. podman-composeのインストール

# RHEL9 / Rocky Linux 9 # dnf install -y podman-compose # Ubuntu 24.04 $ sudo apt-get install -y podman-compose # またはpipからインストール $ pip3 install podman-compose

2. docker-compose.ymlをそのまま使う

既存の docker-compose.yml はほぼそのまま使えるが、一部の構文は非対応だ。

# 例:WordPressのdocker-compose.yml(docker-composeから流用) # version: "3.8" # services: # wordpress: # image: wordpress:latest # ports: # - "8080:80" # environment: # WORDPRESS_DB_HOST: db # WORDPRESS_DB_USER: wpuser # WORDPRESS_DB_PASSWORD: wppassword # WORDPRESS_DB_NAME: wordpress # db: # image: mysql:8.0 # environment: # MYSQL_DATABASE: wordpress # MYSQL_USER: wpuser # MYSQL_PASSWORD: wppassword # MYSQL_RANDOM_ROOT_PASSWORD: "1" # 上記ファイルを使ってコンテナを起動する # podman-compose up -d # 停止する # podman-compose down

rootlessコンテナの設定と実践|一般ユーザーで安全に動かす

1. rootlessモードの確認

podmanはrootlessモードが標準だ。
一般ユーザーでコンテナを起動すると、自動的にrootlessモードで動作する。

# 一般ユーザーでコンテナを起動する(sudoなし) $ podman run -d -p 8080:80 --name my-nginx nginx:latest # コンテナ情報を確認する(rootlessで動作している) $ podman info | grep -A3 rootless rootless: true cgroupVersion: v2 conmonVersion: 2.1.10 # rootlessコンテナのデータは~/.local/share/containers/に保存される $ ls ~/.local/share/containers/storage/ defaultNetworkBackend libpod networks overlay overlay-containers overlay-images

2. rootlessコンテナのポート制限への対処

rootlessモードでは、1024番以下のポートにはバインドできない。
Webサーバーを80番で公開したい場合は、ポートマッピングで対処する。

# rootlessでは1023以下のポートは直接使えないため、高いポートにマッピングする $ podman run -d -p 8080:80 --name my-nginx nginx:latest # アクセス確認 $ curl http://localhost:8080 Welcome to nginx! # systemdのポートフォワードを使って80番→8080番に転送する(本番環境向け) # firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080 --permanent # firewall-cmd --reload

3. systemdサービスとして自動起動する

podmanコンテナをOS起動時に自動起動させるには、systemdユニットを生成する。

# コンテナからsystemdユニットファイルを生成する $ podman generate systemd --new --name my-nginx > ~/.config/systemd/user/container-my-nginx.service # ユーザーレベルのsystemdでサービスを有効化・起動する $ systemctl --user daemon-reload $ systemctl --user enable container-my-nginx $ systemctl --user start container-my-nginx # OS起動時にユーザーセッションなしでサービスを動かすには loginctlを使う $ loginctl enable-linger $USER # サービスの状態確認 $ systemctl --user status container-my-nginx * container-my-nginx.service - Podman container-my-nginx.service Loaded: loaded (/home/webadmin/.config/systemd/user/container-my-nginx.service) Active: active (running) since Tue 2026-05-27 10:00:00 JST

podmanのネットワーク設定|コンテナ間の通信を構成する

1. ネットワークの一覧と作成

# デフォルトネットワークを確認する # podman network ls NETWORK ID NAME DRIVER 2f259bab93aa podman bridge # カスタムネットワークを作成する # podman network create my-network # コンテナをカスタムネットワークで起動する # podman run -d --network my-network --name web nginx:latest # podman run -d --network my-network --name db mysql:8.0 # コンテナ間はコンテナ名でDNS解決できる(同一ネットワーク内) # podman exec web ping db PING db (10.89.0.3): 56 data bytes 64 bytes from 10.89.0.3: icmp_seq=0 ttl=64 time=0.072 ms

podmanのトラブルシュート|よくあるエラーと対処法

1. 「short-name resolution enforced but image xyz is not a short name」エラー

podmanではイメージ名の完全指定が推奨される。

# NGパターン:短縮名での指定 $ podman pull nginx ? Please select an image: ▸ docker.io/library/nginx:latest quay.io/bitnami/nginx:latest # OKパターン:完全名での指定 $ podman pull docker.io/library/nginx:latest # または/etc/containers/registries.confに検索先を明示する # unqualified-search-registries = ["docker.io"]

2. 「ERRO[0000] cannot find UID/GID for user xxx: no subuid/subgid」エラー

rootlessモードに必要な /etc/subuid/etc/subgid が設定されていない場合に発生する。

# /etc/subuidと/etc/subgidを確認する $ cat /etc/subuid webadmin:100000:65536 # ユーザーが存在しない場合は追記する # echo "webadmin:100000:65536" >> /etc/subuid # echo "webadmin:100000:65536" >> /etc/subgid # 設定を反映する $ podman system migrate

3. コンテナのディスク使用量が増えてきた場合

# podmanのディスク使用量を確認する $ podman system df TYPE TOTAL ACTIVE SIZE RECLAIMABLE Images 5 2 1.234GB 890MB (72%) Containers 3 1 45.6MB 23.4MB (51%) Local Volumes 2 1 1.2GB 0B (0%) # 停止中のコンテナとイメージをまとめて削除する(pruneオプション) $ podman system prune WARNING! This will remove: - all stopped containers - all networks not used by at least one container - all dangling images # タグなしのイメージのみを削除する $ podman image prune

本記事のまとめ

podmanはDockerとほぼ同じ操作感で使えながら、セキュリティ面で大きく優れたコンテナツールだ。
RHEL9・Rocky Linux 9・AlmaLinux 9を使うサーバー環境では、Podmanへの移行を早めに進めておきたい。

やりたいこと コマンド
イメージを取得する podman pull docker.io/library/nginx:latest
コンテナをバックグラウンドで起動する podman run -d -p 8080:80 --name 名前 イメージ名
起動中のコンテナを確認する podman ps
コンテナの中に入る podman exec -it コンテナ名 bash
コンテナを停止する podman stop コンテナ名
コンテナを削除する podman rm コンテナ名
イメージ一覧を確認する podman images
イメージを削除する podman rmi イメージ名
コンテナのログを確認する podman logs コンテナ名
docker-composeの代替を使う podman-compose up -d
systemdサービスを生成する podman generate systemd --new --name コンテナ名
不要リソースをまとめて削除する podman system prune

LinuxサーバーのLinux ポート確認の全コマンドと組み合わせて、コンテナで公開しているポートが正しく開いているかを確認する習慣を身につけておこう。
また、podmanで構築したサービスのファイアウォール設定にはLinux DNS 設定の基本と合わせてApache タイムアウト設定の詳細も参照してほしい。

コンテナ技術を使いこなすには、Linuxの基礎力が不可欠だ。
「コマンドは知っているが、なぜそう動くのかわからない」という段階から抜け出したい方は、ぜひ以下のマニュアルを活用してほしい。
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、20年以上の運用経験を持つ現役エンジニアが基礎から教えます。
Linux無料マニュアルを受け取る >>

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

登録10秒/合わなければ解除3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として20年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。