CentOS 8のEOLからPodmanへの移行まで
CentOS 8のサポートが突然終了(EOL)した際、私は5つの本番環境サーバークラスターをCentOS Stream 9に移行するために徹夜したことがあります。その過程で、Red HatのエコシステムにおいてDockerがもはや最優先事項ではないことに気づきました。代わりに、Podmanが深く統合され、デフォルトのツールとなっています。当初はdocker-composeがないことに戸惑いましたが、Podman ComposeとRootlessの仕組みをマスターした後は、システムが軽量化されるだけでなく、セキュリティも大幅に向上したと感じています。
実地比較:Docker Compose vs. Podman Compose
最大の相違点は動作アーキテクチャにあります。Dockerはroot権限で動作するデーモンに依存しています。もしハッカーがデーモンの制御権を奪えば、サーバー全体の制御権を握られてしまいます。対照的に, Podmanはデーモンレス(daemonless)モデルで動作します。各コンテナは単なる通常のユーザープロセスとして扱われます。
Podman Composeの主な利点:
- Rootlessセキュリティ:
sudoを使わずにアプリケーションスタック全体を実行できます。これにより、コンテナからの特権昇格のリスクを90%削減できます。 - リソースの節約: デーモンを排除することで、ノードあたりの静的なRAM消費量を約50MB〜100MB削減できます。
- SELinuxとの互換性: Podmanはセキュリティラベルを自動的に処理します。これはCentOSでDockerを使用する際の「悪夢」であった問題です。
- SELinuxとの互換性: Podmanはセキュリティラベルを自動的に処理します。これは以前、CentOSでDockerを使用する際の「悪夢」であった問題です。
なぜCentOS Stream 9にはPodmanが最適なのか?
CentOS Stream 9では、SELinuxは常にEnforcingモードになっています。Dockerではボリュームをマウントする際にファイルアクセスが拒否されることが多く、ユーザーはSELinuxを無効化せざるを得ないことがありますが、これは非常に危険な行為です。Podmanはその逆です。Red Hatのセキュリティポリシーを理解し、それと調和して動作するように設計されています。保護層を無効にするのではなく、Podmanはそれを利用してアプリケーションをより適切に隔離します。
デプロイ手順の詳細
1. Podmanと補助ツールのインストール
まず、システムを更新し、PodmanとPython Pipをインストールします。CentOS Stream 9では、これらのパッケージは公式リポジトリで常に利用可能です:
sudo dnf update -y
sudo dnf install podman python3-pip -y
次に、最新バージョンを取得するためにpip経由でpodman-composeをインストールします:
pip3 install podman-compose --user
システムがコマンドを認識できるように環境変数を有効にします:
echo 'export PATH=$PATH:$HOME/.local/bin' >> ~/.bashrc
source ~/.bashrc
2. ユーザーのRootless権限の設定
root権限なしでコンテナを実行するには、ユーザーがシステム内で識別されるための専用のID範囲が必要です。次の設定ファイルを確認してください:
cat /etc/subuid
cat /etc/subgid
ファイルが空の場合は、次のコマンドを使用してユーザーにID範囲(通常は65536個のID)を割り当てます:
sudo usermod --add-subuids 100000-165535 --add-subgids 100000-165535 $USER
3. ボリュームマウント時のSELinux問題の解決
これは最も一般的なエラーです。chmod 777を実行しても、コンテナが「Permission Denied」エラーを報告します。原因は、ホストディレクトリのSELinuxラベルがコンテナと一致していないことです。docker-compose.yamlファイルで、ボリュームパスの後に接尾辞:Zを追加するだけです。
version: '3.8'
services:
db:
image: mariadb:10.6
environment:
MYSQL_ROOT_PASSWORD: strong_password_here
volumes:
- ./db_data:/var/lib/mysql:Z # :Z はラベルを container_file_t に変更するのに役立ちます
web:
image: nginx:alpine
ports:
- "8080:80"
volumes:
- ./html:/usr/share/nginx/html:Z
depends_on:
- db
4. アプリケーションの管理
使い慣れたコマンドでスタック全体を起動します:
podman-compose up -d
ユーザー権限で実行されているコンテナの状態を確認するには:
podman ps
低ポート(80, 443)の処理に関するヒント
Rootlessモードでは、1024未満のポートに直接バインドすることはできません。root権限で実行する代わりに、私は通常アプリケーションを高いポート(8080など)にバインドし、firewalldを使用してトラフィックをリダイレクトします。この方法は安全性を確保しつつ、厳しいセキュリティ基準を満たすのに役立ちます。
ポート80を8080に転送するコマンド:
sudo firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080 --permanent
sudo firewall-cmd --reload
DockerからPodmanへの移行は、最初は少し慣れが必要かもしれません。しかし、CentOS Stream 9にもたらされる安定性とセキュリティは、それだけの価値が十分にあります。設定がうまくいくことを願っています!

