RHEL 10 / Rocky Linux 10でDockerが使えない?Podmanで完全互換コンテナ環境を構築する方法
はじめに
Rocky Linux 10(RHEL 10ベース)を使ってコンテナ環境を構築しようとして、Dockerがインストールできずに困っていませんか?
実は、RHEL 10からDockerコンテナエンジンが公式に削除されました。しかし心配無用。Red HatはDockerの完全上位互換であるPodmanを標準提供しており、これまでのDockerワークフローをそのまま継続できます。
本記事では、Rocky Linux 10でPodmanを使った完全なコンテナ環境構築方法を解説します。
🚨 なぜDockerがインストールできないのか?
問題:Docker公式リポジトリで404エラー
Rocky Linux 10でDockerをインストールしようとすると、以下のようなエラーが発生します:
$ sudo dnf update -y docker-ce-stable
Docker CE Stable - x86_64 68 B/s | 402 B 00:05
Errors during downloading metadata for repository 'docker-ce-stable':
- Status code: 404 for https://download.docker.com/linux/rhel/10/x86_64/stable/repodata/repomd.xml
原因:RHEL 10の方針変更
Red Hat Enterprise Linux 10の公式ドキュメント「コンテナーの構築、実行、および管理」には、以下の記載があります:
Red Hat では、RHEL 10 から Docker コンテナーエンジンと、docker コマンドが削除されました。
(出典:Red Hat Enterprise Linux 10 コンテナーの構築、実行、および管理 - 1.2. DOCKER を使用せずにコンテナーを実行)
同ドキュメントでは、代替手段として以下も明記されています:
podman-docker パッケージをインストールできます。docker コマンドを実行するたびに、実際には podman コマンドが実行されます。
つまり、これは一時的な問題ではなく、Red Hatの戦略的方針変更であり、Podmanが公式に推奨されるソリューションです。
解決策:Podmanへの移行
Red Hatは代替としてPodmanを提供しており、以下の利点があります:
- ✅ 完全なDocker互換性:既存のDockerfileやdocker-composeがそのまま使用可能
- ✅ セキュリティ向上:ルートレス実行で安全性が大幅向上
- ✅ リソース効率:デーモンレスでシステムリソースを節約
- ✅ 企業サポート:RHEL系Linuxで長期サポート保証
これを機にPodmanを使ってみるのもあり。
🛠️ 環境構築手順
前提条件の確認
まず、システムが要件を満たしているか確認します:
OS確認
$ cat /etc/os-release
出力例:
NAME="Rocky Linux"
VERSION="10.0 (Red Quartz)"
ID="rocky"
PLATFORM_ID="platform:el10"
CPUアーキテクチャ確認(x86-64-v3必須)
$ grep -o 'avx2\|bmi1\|bmi2\|f16c\|fma\|abm\|movbe\|xsave' /proc/cpuinfo | sort -u
出力例:
abm
avx2
bmi1
bmi2
f16c
fma
movbe
xsave
メモリ確認
$ free -h
出力例:
total used free shared buff/cache available
Mem: 7.5Gi 764Mi 6.5Gi 9.0Mi 503Mi 6.7Gi
Rocky Linux 10.0でx86-64-v3対応CPU、十分なメモリが確認できました。
ステップ1:利用可能パッケージの確認
Rocky Linux 10で提供されるコンテナ関連パッケージを確認:
リポジトリ確認
$ sudo dnf repolist
出力例:
repo id repo の名前
appstream Rocky Linux 10 - AppStream
baseos Rocky Linux 10 - BaseOS
extras Rocky Linux 10 - Extras
Podman関連パッケージ検索
$ dnf search podman
出力例:
========================== 名前 完全一致: podman ==========================
podman.x86_64 : Manage Pods, Containers and Container Images
======================== 名前 & 概要 一致: podman =========================
podman-docker.noarch : Emulate Docker CLI using podman
podman-remote.x86_64 : (Experimental) Remote client for managing podman containers
Buildahの確認
$ dnf search buildah
出力例:
========================= 名前 完全一致: buildah ==========================
buildah.x86_64 : A command line tool used for creating OCI Images
kopeoも確認
$ dnf search skopeo
出力例:
========================== 名前 完全一致: skopeo ==========================
skopeo.x86_64 : Inspect container images and repositories on registries
ステップ2:コンテナツールチェーンのインストール
必要なツール一式をインストールします:
# メインツールの一括インストール
sudo dnf install -y podman buildah skopeo crun
# Docker互換とコンテナ管理ツール
sudo dnf install -y podman-docker containers-common container-selinux
# ルートレスコンテナ用ツール
sudo dnf install -y fuse-overlayfs conmon aardvark-dns
# 開発・監視ツール(EPELから: オプション)
sudo dnf install -y epel-release
sudo dnf install -y htop tree jq
ステップ3:インストール確認
各ツールのバージョンを確認:
podman
$ podman --version
podman version 5.4.0
buildah
$ buildah --version
buildah version 1.39.4 (image-spec 1.1.0, runtime-spec 1.2.0)
skopeo
$ skopeo --version
skopeo version 1.18.1
crun
$ crun --version
crun version 1.21
commit: 10269840aa07fb7e6b7e1acff6198692d8ff5c88
spec: 1.0.0
+SYSTEMD +SELINUX +APPARMOR +CAP +SECCOMP +EBPF +CRIU +YAJL
ステップ4:Docker完全互換設定
Dockerコマンドをそのまま使えるよう設定:
Docker互換エイリアス設定
echo 'alias docker=podman' >> ~/.bashrc
source ~/.bashrc
動作確認
$ docker --version
podman version 5.4.0
Hello Worldテスト
$ docker run --rm hello-world
!... Hello Podman World ...!
.--"--.
/ - - \
/ (O) (O) \
~~~| -=(,Y,)=- |
.---. /` \ |~~
~/ o o \~~~~.----. ~~
| =(X)= |~ / (O (O) \
~~~~~~~ ~| =(Y_)=- |
~~~~ ~~~| U |~~
Project: https://github.com/containers/podman
Website: https://podman.io
🚀 実践的な使用例
Webサーバーの起動
Dockerと全く同じ構文でNginxを起動:
Nginx起動
$ docker run -d -p 8080:80 --name web-server nginx
確認
$ docker ps
例:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a1b2c3d4e5f6 docker.io/library/nginx:latest nginx -g daemon o... 10 seconds ago Up 10 seconds 0.0.0.0:8080->80/tcp web-server
アクセステスト
$ curl http://localhost:8080
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
...
Docker Composeの使用
podman compose
は外部のcompose providerを呼び出すラッパーコマンドです。使用には事前にcompose実装のインストールが必要です:
Compose Providerのインストール
方法1:Docker Compose公式版(推奨)
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
方法2:podman-compose(Python実装)
pip3 install --user podman-compose
方法3:DNFパッケージ(利用可能な場合)
dnf search docker-compose
sudo dnf install -y docker-compose # パッケージが存在する場合
Compose実装インストール後に実行
podman compose up -d # podman composeラッパー経由
# または
docker-compose up -d # 直接実行
# または
podman-compose up -d # podman-compose直接実行
コンテナ管理操作
# コンテナ一覧
docker ps -a
# ログ確認
docker logs web-server
# コンテナ内でコマンド実行
docker exec -it web-server bash
# リソース使用量
docker stats
# システム情報
podman system df
🔒 Podmanのセキュリティ優位性
ルートレス実行
Podmanの最大の利点の一つは、root権限なしでコンテナを実行できることです:
# 一般ユーザーでセキュアに実行
$ podman run --rm alpine id
uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel),11(floppy),20(dialout),26(tape),27(video)
# しかし、ホストでは一般ユーザーのまま
$ podman unshare id
uid=0(root) gid=0(root) groups=0(root)
$ id # ホスト側
uid=1000(kato) gid=1000(kato) groups=1000(kato),10(wheel)
権限分離の確認
# ユーザー名前空間の確認
$ podman unshare cat /proc/self/uid_map
0 1000 1
1 100000 65536
$ podman unshare cat /proc/self/gid_map
0 1000 1
1 100000 65536
これにより、コンテナが侵害されてもホストシステムへの影響を最小限に抑えられます。
📊 DockerとPodmanの比較
項目 | Docker | Podman |
---|---|---|
アーキテクチャ | デーモンベース | デーモンレス |
root権限 | 必要 | 不要(ルートレス) |
リソース使用量 | 常時メモリ消費 | コンテナ実行時のみ |
セキュリティ | root権限リスク | 権限分離によりセキュア |
RHEL 10サポート | ❌ 削除済み | ✅ 公式サポート |
既存ワークフロー | ネイティブ | ✅ 完全互換 |
systemd統合 | 外部連携 | ✅ ネイティブ統合 |
🔧 高度な設定
レジストリー設定のカスタマイズ
# ユーザー設定ディレクトリ作成
mkdir -p ~/.config/containers
# カスタムレジストリー設定
cat > ~/.config/containers/registries.conf << 'EOF'
unqualified-search-registries = [
"registry.access.redhat.com",
"registry.redhat.io",
"quay.io",
"docker.io"
]
short-name-mode = "enforcing"
[[registry]]
location = "registry.redhat.io"
insecure = false
[[registry]]
location = "docker.io"
insecure = false
EOF
Systemdサービス化
# Podman APIサービス有効化
systemctl --user enable --now podman.socket
# コンテナのSystemdサービス化
podman generate systemd --name web-server > ~/.config/systemd/user/web-server.service
systemctl --user enable web-server.service
# 自動起動設定
sudo loginctl enable-linger $USER
💡 移行のポイント
既存Dockerユーザーへの推奨事項
- 学習コストゼロ:既存のDockerコマンドとdocker-composeファイルをそのまま使用
- セキュリティ向上:ルートレス実行でセキュリティリスクを大幅軽減
- パフォーマンス向上:デーモンレスでシステムリソースを効率的に使用
- 将来保証:RHEL系Linuxでの長期サポート
注意点
- ポート制限:ルートレスモードでは1024未満のポートは使用不可(回避方法あり)
- Docker Hub:レート制限があるため、企業環境では内部レジストリー推奨
- レガシー機能:一部のDocker Swarm機能は未サポート
🎯 まとめ
Rocky Linux 10(RHEL 10)では、Dockerの代わりにPodmanを使用することで:
✅ 完全なDocker互換性を保ちながら
✅ セキュリティを大幅向上させ
✅ システムリソースを効率化できます
特に企業環境では、Red Hatの公式サポートがあるPodmanの採用が戦略的に正しい選択です。
既存のDockerワークフローをそのまま継続でき、学習コストはほぼゼロです。むしろ、セキュリティとパフォーマンスの向上により、より優れたコンテナ環境を構築できます。
📚 参考資料
🙋♂️ おわりに
この記事が、Rocky Linux 10でのコンテナ環境構築に悩んでいる方の助けになれば幸いです。
Podmanは単なるDockerの代替ではなく、より安全で効率的な次世代コンテナプラットフォームです。ぜひ積極的に活用してください!
何か質問やフィードバックがあれば、コメントでお知らせください。
Discussion