Podman Rootless on Ubuntu — root不要のセキュアなコンテナ実行

コンテナ

注意

本記事のコマンドは Ubuntu 24.04 LTS(Noble Numbat)で検証しています。Ubuntu 22.04 では Podman のバージョンが 3.4.4 と異なります。バージョンによって動作が変わる場合がありますのでご注意ください。

「Podman は rootless って聞いたけど、何が違うの?」「root なしでコンテナを動かして、本当に安全なの?」——コンテナに興味が出てきたとき、こんな疑問を持つ方は多いと思います。

結論から言うと、Podman はインストールした瞬間から一般ユーザーとしてコンテナを動かせます。Docker のように root 権限や追加設定は不要で、Ubuntu 24.04 なら apt install podman の一行で完結します。

本記事では Ubuntu 24.04 LTS の Docker 公式イメージで実際にコマンドを実行し、Podman Rootless の仕組み・前提条件・動作確認の手順を解説します。subuid/subgid の意味から UID マッピングの確認、systemd ユーザーサービスの設定まで、順を追って説明します。

この記事のポイント

  • Ubuntu 24.04 では apt install podmanPodman 4.9.3 が入り、追加設定なしで rootless 動作する(2026-06-14 実測)
  • /etc/subuidubuntu:100000:65536 が自動設定済み——これが rootless の鍵
  • コンテナ内は root に見えるが、ホスト OS 上では UID 100000 として動く(実測で確認)
  • Docker rootless は追加スクリプトが必要、Podman は最初から rootless がデフォルト
  • systemctl --user enable podman.socket でユーザーレベルの API ソケットを有効化できる

目次

  1. Rootless コンテナとは何か
  2. 前提条件:subuid / subgid とユーザーネームスペース
  3. Ubuntu 24.04 に Podman をインストールする
  4. Rootless でコンテナを起動してみる
  5. UID マッピングを確認する
  6. systemd ユーザーサービスとして管理する
  7. Docker Rootless との比較
  8. よくあるエラーと解決策
  9. まとめ

Rootless コンテナとは何か

通常の Docker 環境では、コンテナを動かすために dockerd というデーモンが root として常時起動しています。これはセキュリティ上のリスクです——コンテナの脆弱性が悪用された場合、攻撃者がホスト OS に対して root 権限を持つ可能性があります。

Rootless コンテナとは、root 権限を持たない一般ユーザーとしてコンテナエンジン自体を動かす仕組みです。Podman の場合、デーモンプロセスがそもそも存在しないため、一般ユーザーが直接コンテナを起動できます。

コンテナ内では「root(UID 0)に見える」状態で動きますが、ホスト OS から見ると一般ユーザーの UID で動作します。これが Rootless の核心です。

前提条件:subuid / subgid とユーザーネームスペース

Rootless コンテナが機能するためには、2 つの前提条件が必要です。

①サブ UID / サブ GID の設定

/etc/subuid/etc/subgid には、一般ユーザーが使用できる UID / GID の範囲が定義されています。Ubuntu 24.04 では useradd でユーザーを作成すると自動的に割り当てられます。

subuid/subgid の実測確認(Ubuntu 24.04)
subuid/subgid の実測確認(Ubuntu 24.04)



ubuntu@myserver: ~
$ cat /etc/subuid
ubuntu:100000:65536
$ cat /etc/subgid
ubuntu:100000:65536

ubuntu:100000:65536 は「ubuntu ユーザーが UID 100000 から始まる 65536 個のサブ UID を使える」という意味です。コンテナ内の root(UID 0)はホスト OS では UID 100000 にマッピングされます。

VPS の場合は要確認

Ubuntu Server を最小インストールした場合、/etc/subuid が空のことがあります。その場合は sudo usermod --add-subuids 100000-165535 --add-subgids 100000-165535 USERNAME で手動追加してください。

②ユーザーネームスペースの有効化

カーネルが UID/GID のネームスペース(名前空間)隔離に対応している必要があります。Ubuntu 24.04 では標準で有効になっています。




ubuntu@myserver: ~
$ cat /proc/sys/user/max_user_namespaces
47415
# 0 以外なら有効です

実測では 47415 が返ってきました。0 が表示された場合は、echo 65536 | sudo tee /proc/sys/user/max_user_namespaces で有効化できます。

Ubuntu 24.04 に Podman をインストールする

Ubuntu 24.04 のパッケージリポジトリには Podman 4.9.3 が含まれています(2026-06-14 実測)。インストールは 1 コマンドで完了します。




ubuntu@myserver: ~
$ sudo apt update && sudo apt install -y podman
Reading package lists… Done
Building dependency tree… Done
102 newly installed, 0 to remove and 0 not upgraded.
Need to get 66.6 MB of archives.
Setting up fuse-overlayfs (1.13-1) …
Setting up slirp4netns (1.2.3-1) …
Setting up podman (4.9.3+ds1-1ubuntu0.2) …
$ podman –version
podman version 4.9.3
apt install podman の実ログ(Ubuntu 24.04 実測)
apt install podman の実ログ(Ubuntu 24.04 実測)

インストール時に注目したいのが自動インストールされる依存パッケージです。Rootless 動作に必要なものが一式揃います。

パッケージ 役割
fuse-overlayfs Rootless 環境でのオーバーレイファイルシステム
slirp4netns / passt ユーザー空間ネットワーク(root なしで NAT)
uidmap newuidmap / newgidmap(UID マッピングツール)
netavark / aardvark-dns コンテナネットワーク管理・DNS 解決
crun 軽量 OCI コンテナランタイム(Rootless に最適化)

Ubuntu 22.04 との比較

Ubuntu 22.04 / 24.04 の Podman バージョン比較(実測)
Ubuntu 22.04 / 24.04 の Podman バージョン比較(実測)

Ubuntu 22.04 で apt-cache policy podman を実行すると、インストール候補は 3.4.4+ds1-1ubuntu1.22.04.3 です。Ubuntu 24.04 の 4.9.3 と比べると 1 世代以上古く、ネットワーク周りの挙動が大きく異なります。VPS でコンテナを使う場合は Ubuntu 24.04 を選ぶのがおすすめです。

Rootless でコンテナを起動してみる

インストールが完了したら、一般ユーザーとして(sudo なしで)コンテナを起動できます。

Podman Rootless の動作確認(Ubuntu 24.04 実測)
Podman Rootless の動作確認(Ubuntu 24.04 実測)



ubuntu@myserver: ~
# sudo なしでコンテナを起動する
$ podman run –rm hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.
$ podman run –rm alpine echo “I am rootless!”
I am rootless!

正直、「え、これだけ?」と拍子抜けするくらい簡単です。Docker と全く同じコマンド構文で動き、かつ root を使っていません。これが Podman の最大のメリットです。

ストレージパスを確認する

Rootless モードでは、イメージとコンテナのデータは ホームディレクトリ以下に保存されます。root が管理する /var/lib/containers とは別のパスです。




ubuntu@myserver: ~
# イメージを pull して保存場所を確認する
$ podman pull docker.io/library/alpine
alpine: Pulling from library/alpine
$ ls ~/.local/share/containers/storage/
defaultNetworkBackend libpod mounts overlay overlay-containers
# ホームディレクトリ以下に保存されている

UID マッピングを確認する

Rootless の仕組みの核心は「UID マッピング」です。コンテナ内では root(UID 0)として動いているように見えますが、ホスト OS から見ると別の UID になっています。

UID マッピングの確認(Ubuntu 24.04 実測)
UID マッピングの確認(Ubuntu 24.04 実測)



ubuntu@myserver: ~
# コンテナ内で id を実行すると root に見える
$ podman run –rm alpine id
uid=0(root) gid=0(root) groups=0(root)
# コンテナの UID マッピングを確認する
$ podman run –rm alpine cat /proc/self/uid_map
0 100000 65536
# → コンテナ内 0(root)= ホスト上 100000 にマッピング
# つまりホスト OS にとっては一般ユーザー権限と同じ

0 100000 65536 という数値の意味:「コンテナ内 UID 0 から始まる 65536 個は、ホスト上では UID 100000 から始まる範囲にマッピングする」です。これが /etc/subuid で設定した範囲と一致しています。

ホスト OS 上で ps aux を実行してコンテナプロセスを見ると、ubuntu ユーザー(UID 1000)またはサブ UID 範囲の UID で動いていることが確認できます。

newuidmap / newgidmap の役割




ubuntu@myserver: ~
$ ls -la /usr/bin/newuidmap /usr/bin/newgidmap
-rwsr-xr-x 1 root root 70256 May 30 2024 /usr/bin/newgidmap
-rwsr-xr-x 1 root root 70256 May 30 2024 /usr/bin/newuidmap

-rwss が SUID ビットを示しています。これにより、一般ユーザーが実行しても root として動作し、UID マッピングの設定(/proc/PID/uid_map への書き込み)ができます。root 権限なしで UID 名前空間を扱うための特別な仕組みです。

systemd ユーザーサービスとして管理する

Podman の Rootless ソケット(API エンドポイント)を常時起動しておきたい場合、systemd のユーザーサービスとして管理できます。




ubuntu@myserver: ~
# ユーザーレベルの podman ソケットを有効化する
$ systemctl –user enable –now podman.socket
Created symlink ~/.config/systemd/user/sockets.target.wants/podman.socket
$ systemctl –user status podman.socket
● podman.socket – Podman API Socket
Loaded: loaded (/usr/lib/systemd/user/podman.socket; enabled)
Active: active (listening)
Listen: /run/user/1000/podman/podman.sock (Stream)
# ユーザーごとに独立したソケットパス /run/user/<UID>/podman/podman.sock

ソケットパスの %t は systemd の変数で、/run/user/<UID> に展開されます。実測で取得したソケットの設定内容は次の通りです:




ubuntu@myserver: ~ (podman.socket の内容)
$ cat /usr/lib/systemd/user/podman.socket
[Unit]
Description=Podman API Socket
Documentation=man:podman-system-service(1)

[Socket]
ListenStream=%t/podman/podman.sock
SocketMode=0660

[Install]
WantedBy=sockets.target

Docker Desktop 代替として podman-docker パッケージを入れると、docker コマンドが podman にエイリアスされ、既存のツール(docker-compose など)がそのまま使えるようになります。




ubuntu@myserver: ~
# docker コマンドで podman を呼び出せるようにする
$ sudo apt install -y podman-docker
Note: This may take a while.
$ docker –version
Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg.
podman version 4.9.3

ログインセッション終了後も動かし続ける

SSH ログアウト後もコンテナを動かし続けるには、「ログイン不要のライブタイム」を有効にする必要があります。




ubuntu@myserver: ~
$ sudo loginctl enable-linger ubuntu
# ubuntu ユーザーのセッションを SSH ログアウト後も維持する
$ loginctl show-user ubuntu | grep Linger
Linger=yes

Docker Rootless との比較

Docker vs Podman Rootless 比較表(illustrative)
Docker vs Podman Rootless 比較表(illustrative)

Docker にも rootless モード がありますが、設定が複雑です。dockerd-rootless-extras パッケージを追加インストールし、dockerd-rootless-setuptool.sh install を実行する必要があります。

一方 Podman は追加設定なしで rootless がデフォルトです。実際に Ubuntu 24.04 で確認したところ、Docker には dockerd-rootless.sh が含まれておらず、別途 docker-rootless-extras パッケージが必要でした。

比較項目 Docker rootless Podman(デフォルト)
設定の手間 追加スクリプト実行が必要 追加設定なし(デフォルト)
デーモン dockerd(ユーザーレベル) なし(daemonless)
コマンド互換性 docker run podman run(同一構文)
cgroup サポート v2 推奨(v1 制限あり) v2 対応(Ubuntu 24.04 はデフォルト v2)
systemd 統合 限定的 podman generate systemd コマンドあり

「既存の Docker ワークフローをそのまま使いたい」という場合は podman-docker で docker コマンドをエイリアスする方法が最も手軽です。

よくあるエラーと解決策

エラー①:ERRO[0000] cannot clone: Operation not permitted




ubuntu@myserver: ~
ERRO[0000] cannot clone: Operation not permitted
Error: cannot re-exec process

原因:ユーザーネームスペースが無効になっています。カーネルの max_user_namespaces が 0 になっているか、セキュリティ設定で制限されています。

解決策:




ubuntu@myserver: ~
$ cat /proc/sys/user/max_user_namespaces
0
$ echo 65536 | sudo tee /proc/sys/user/max_user_namespaces
65536
# 永続化するには /etc/sysctl.conf に追記する
$ echo “user.max_user_namespaces=65536” | sudo tee -a /etc/sysctl.conf
$ sudo sysctl -p

エラー②:Error: missing range




ubuntu@myserver: ~
Error: missing range

原因:/etc/subuid または /etc/subgid にエントリがありません。

解決策:




ubuntu@myserver: ~
$ sudo usermod –add-subuids 100000-165535 $(whoami)
$ sudo usermod –add-subgids 100000-165535 $(whoami)
$ cat /etc/subuid
ubuntu:100000:65536
# podman system migrate で設定を反映させる
$ podman system migrate

エラー③:network connection to “0.0.0.0:8080” refused(コンテナがホストからアクセスできない)

Rootless のネットワーク制限

Rootless モードではコンテナへのポートバインドに制限があります。-p 80:80 のように 1024 未満のポートを使う場合は --sysctl net.ipv4.ip_unprivileged_port_start=80 オプションが必要です。VPS でウェブサーバーを公開するときは 8080 などの高位ポートを使い、nginx をリバースプロキシとして前段に置く構成が一般的です。

まとめ

Podman Rootless は apt install podman の一行だけで使えるようになり、追加設定は不要です。Ubuntu 24.04 では 4.9.3 が標準提供され(実測)、インストールと同時に rootless 動作に必要な fuse-overlayfsslirp4netnsuidmap が揃います。

  • /etc/subuidubuntu:100000:65536 が rootless の鍵——コンテナ内 root = ホスト UID 100000
  • cat /proc/self/uid_map でコンテナ内から UID マッピングを確認できる(実測値: 0 100000 65536)
  • systemctl --user enable podman.socket で API ソケットをユーザーレベルで常時起動できる
  • Docker rootless より設定が圧倒的に簡単。Docker コマンドとの互換性も高い
  • 1024 未満のポートバインドには追加オプションが必要なのが唯一の制限点

Podman Rootless は VPS で複数のサービスを運用する際に特に効果的です。各サービスを別のユーザーで動かすことで、1 つのコンテナが侵害されてもホスト全体へのダメージを最小化できます。セキュリティを気にしながら自宅サーバーや VPS でコンテナを使いたい方に、ぜひ試してみてほしいツールです。

VPS 上で Podman や Docker を実際に運用してみたい方は、東京リージョンが使える Vultr が最もシンプルで始めやすいです。月額 $5 からの 1GB プランで今回の手順がそのまま試せます。

VPS 各社の料金・性能を比較した記事もあわせてご覧ください:

コメント

タイトルとURLをコピーしました