「SAVACAN」担当のMKです。
本記事では、RedHatが開発するコンテナ管理ツール「Podman」のインストール方法と、Dockerとの相違点についてまとめました。
Podmanを検証するに至った背景として、RHEL8系以降から標準のコンテナ管理ツールがDockerからPodmanへ変更となった点が挙げられます。
Dockerは広く普及しており、RHEL系環境で利用できなくなる可能性は低いと考えられますが、標準提供であるPodmanへの理解を深めておくことは重要です。
Podmanとは何か
PodmanはDockerと高い互換性を持つコンテナ管理ツールです。
コマンドライン操作においては、dockerコマンドをpodmanコマンドに置き換えるだけで、ほぼ同様の操作が可能です。
一方で、両者はアーキテクチャ(設計思想)やセキュリティモデルにおいては大きな違いがありますので、次でご説明致します。
PodmanとDockerの互換箇所・非互換箇所
- 互換箇所
Dockerfileはpodmanでも基本的にそのまま使用可能
CLIの互換性(コマンド部分のdockerをpodmanに置き換えればほぼ動作する)
OCI準拠(コンテナランタイムの標準仕様)のためイメージ・レジストリはどちらでも使える
- 非互換箇所
docker-composeが完全互換ではない(podman composeとして提供、最近ではかなり高い互換性)
dockerにあるオーケストレーション機能のswarmがpodmanにない(Podmanではオーケストレーション機能は別ソフトに任せる設計仕様)
PodmanとDockerの設計上の相違点
PodmanとDockerでは、設計思想・開発方針において明確な相違点がありますので解説します。
PodmanとDockerを設計思想の観点から比較すると、後発であるPodmanはセキュリティや運用面を考慮した先進的な設計が採用されており、機能面では優れていると評価される場面もあります。
一方で、Dockerはデーモン型アーキテクチャを採用しているため、トラブル発生時の原因切り分けや運用管理のしやすさといった点では、依然としてメリットがあると考えられます。
・デーモン
Podmanはデーモンの操作が不要、podmanコマンドが直接コンテナを操作
Dockerデーモンが常駐し、クライアントはREST APIでデーモンを操作
・Root権限の必要性(Rootless)
Podmanはコンテナの実行にRoot権限を必要としない(Rootless実行が標準)
DockerはデーモンがRoot権限で動作(現在はRootless modeもあるが非標準)
・セキュリティ
PodmanはRootlessで実行し、攻撃対象となる常駐デーモンがないため攻撃対象を減らす事ができるためよりセキュリティが考慮されています。
Podmanインストール手順
今回は、Podmanを用いたコンテナ操作について、実際に環境を作りながらContainerfileやpodman-compose.ymlを使って、PodmanとDockerの違いを比較してみます。
なお、Dockerが既にインストールされているサーバーでは、パッケージの競合によりPodmanを同時にインストールできません。インストール前にご確認ください。
まずはPodmanのインストールから始めます。
dnf install podman podman-compose
podman -v
podman version 4.9.4-rheldockerのライブラリからコンテナをダウンロードします。今回はMysqlのコンテナイメージを指定します。
podman pull mysql:5.7
# 実行するとredhatのレジストリかdockerのライブラリかダウンロード先の選択肢が出ますのでdockerのライブラリを選択します。
# ダウンロードができたら確認します。
podman images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/library/mysql 5.7 5107333e08a8 2 years ago 520 MBコンテナを実行します。
podman run -it --name mkmysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=spitest -d mysql:5.7起動確認
podman exec -it mkmysql bash -p
mysql -h 127.0.0.1 -P 3306 -u root -p停止
podman stop mkmysql起動
podman start mkmysqlコンテナをsystemdに登録することもできます。
podman generate systemd --name mkmysql --files --new
mv container-mkmysql.service /etc/systemd/system/
systemctl daemon-reload
systemctl enable container-mkmysql
systemctl start container-mkmysql簡単な確認ですがDockerと同じ動作をしました。
Containerfile作成
ContainerfileはdockerのDockerfileに相当する仕組みです。
ファイル名をDockerfileとしても同じ動作をします。
記述ルールはほとんどDockergfileと同様なので、そのまま流用可能な場合が多いです。
httpd2.4のコンテナにIPアドレスでアクセスしたときに Containerfile test!! と表示させる状態で起動させます。
vi Containerfile
FROM httpd:2.4
RUN echo "Containerfile test!!" > /usr/local/apache2/htdocs/index.html
podman build -t mkhttpd .
podman run --name mkhttpd -d -p 80:80 mkhttpdこちらも簡単な確認ではありますがDockerのDockerfileと同じ動作をしました。
podman-compose.ymlを作成する
podman-compose.ymlでは、以下の内容でdocker-compose.ymlと同じ動作をするか確認します。
・確認内容
1.php + apacheのコンテナを起動
2.mysqlのコンテナを起動
3.インストール時に実行するコマンドはContainerfileを使用
4.mk-lanというネットワークに所属する
5.実データの保存にはvolumeを作成する
vi ./apache/Containerfile
FROM php:8.2-apache
RUN docker-php-ext-install pdo_mysql mysqlivi podman-compose.yml
services:
apache:
build: ./apache
container_name: mkapache
depends_on:
- mysql
networks:
- lan
ports:
- ${APACHE_PORT:-80}:80
volumes:
- apache-data:/var/www/html
mysql:
image: mysql:5.7
container_name: mkmysql
networks:
- lan
ports:
- ${MYSQL_PORT:-3306}:3306
volumes:
- mysql-data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: mktest
volumes:
apache-data:
name: apache-data
mysql-data:
name: mysql-data
networks:
lan:
name: mk-lan作成できたら実行してみます。
podman compose up -dイメージダウンロードやビルドが順次実行されていきます。
-d のオプションを付けて実行するとバックグラウンドで作業してくれます。
停止+コンテナ削除
podman compose down停止のみ
podman stop コンテナ名volumesのデータ格納先を確認します。
podman volume ls
local apache-data
local mysql-data
・保存先
/var/lib/containers/storage/volumes/データの格納テストをします。
podman exec -it mkapache bash -p
root@3198a5c10481:/var/www/html# touch test
root@3198a5c10481:/var/www/html#
exit
ls -al /var/lib/containers/storage/volumes/apache-data/_data/test
-rw-r--r-- 1 root root 0 1月 13 13:29 /var/lib/containers/storage/volumes/apache-data/_data/testpodmanのネットワークを確認します。
podman network ls
NETWORK ID NAME DRIVER
adf2abc39bba mk-lan bridge
2f259bab93aa podman bridgedockerと違いコンテナ名は表示されませんでした。
podman network inspect mk-lan
[
{
"name": "mk-lan",
"id": "adf2abc39bba1a38e7329c0b98e024d0e8442600921c6efb2901015be7e5988c",
"driver": "bridge",
"network_interface": "cni-podman1",
"created": "2026-01-13T12:31:45.079384144+09:00",
"subnets": [
{
"subnet": "10.89.0.0/24",
"gateway": "10.89.0.1"
}
],
"ipv6_enabled": false,
"internal": false,
"dns_enabled": true,
"labels": {
"com.docker.compose.project": "root",
"io.podman.compose.project": "root"
},
"ipam_options": {
"driver": "host-local"
}
}
]podmanで所属ネットワークを確認する場合は下記コマンドを実行します。
podman inspect mkapache | grep -A10 Networks
"Networks": {
"mk-lan": {
"EndpointID": "",
"Gateway": "10.89.0.1",
"IPAddress": "10.89.0.12",
"IPPrefixLen": 24,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "XX:XX:XX:XX:XX:XX",
"NetworkID": "mk-lan",コンテナ内からコンテナ間の疎通を確認します。
podman exec -it mkapache bash -p
root@0f7165323464:/var/www/html# getent hosts mkmysql
10.89.0.11 mkmysql.dns.podmanphpモジュール確認がインストールされているか確認します。
podman exec -it mkapache php -mpodman-compose.ymlとdocker-compose.ymlでは、簡単な構造であれば特に意識することなく相互に利用可能な事が確認できました。コンテナネットワークの機能も同等でしたが、ステータス表示時には若干の差異があるようなので、自動化などで活用している場合には注意が必要ですね。
最後に
今回の検証の結果、PodmanとDockerはほぼ同様の操作が可能であり、イメージ定義ファイルにも高い互換性があることが確認できました。必要な場合には、DockerからPodmanへの移行も十分検討範囲である事が分かりました。
今後は、より複雑なコンテナ構造の場合の検証も行いたいと思います。
スペース・アイでは、クラウドや仮想化技術だけでなく、コンテナ技術を活用したインフラ構築にも幅広く対応しております。コンテナ技術を活用することで柔軟でリソース効率の高いシステム設計が可能になります。
ご相談やご質問などございましたら、どうぞお気軽にお問い合わせください。
