非特権ユーザーで動かす - rootless
コンテナランタイムとコンテナ内プロセスを非特権ユーザーで動かす方式。万一コンテナから脱出されてもホスト側で root を奪われない構成にできる。Podman はデフォルト、Docker もオプションで対応。
概念図
構文
bash
dockerd-rootless-setuptool.sh install
podman run --rm alpine id実例
Docker を rootless モードでインストール
bash
dockerd-rootless-setuptool.sh installユーザー単位で Docker デーモンを起動
bash
systemctl --user start dockerPodman はインストール直後から rootless で動く
bash
podman run --rm -it alpine sh概要
従来の Docker はデーモンを root で動かし、Docker ソケットにアクセスできるユーザーは実質 root 相当の権限を得ていました。
Rootless モードではデーモン自体を一般ユーザーの UID で起動し、user namespace を使ってコンテナ内 root をホスト側の一般 UID にマッピングします。
これにより、コンテナ内でのファイル作成・権限昇格・bind mount などがすべて起動ユーザーの権限内に収まり、コンテナ脱出時のホスト影響が大幅に小さくなります。
Podman はこの方式を最初から前提に設計されており、Docker も 20.10 以降で正式サポートされています。
典型的な用途
- 開発者マシンでの日常利用(手元で root 権限を振り回したくない)
- 共有サーバー / HPC 環境で、複数ユーザーが互いに干渉せずコンテナを使う
- CI ランナーで信頼境界を 1 段増やす
- セキュリティ要件が厳しい組織での Docker 利用(監査対応)
- 教育環境・研究環境で root を配らずにコンテナを体験させる
コマンド例
# Docker を rootless で有効化
dockerd-rootless-setuptool.sh install
export DOCKER_HOST=unix:///run/user/$(id -u)/docker.sock
docker info | grep -i rootless
# Podman は追加設定なしで動く
podman run --rm -it alpine id
# uid=0(root) gid=0(root) ← 見かけ上 root だが、ホストから見ると一般 UID
# ホスト側で実際の UID を確認
ps -eo uid,cmd | grep containerd
ベストプラクティス
- 新規導入のサーバーは最初から rootless(または Podman)で始め、root デーモン前提のスクリプトを書かない
- 1024 番未満のポートを使う場合は
sysctl net.ipv4.ip_unprivileged_port_start=80かsetcap cap_net_bind_serviceで対処する subuid/subgidを十分な範囲(65536 × ユーザー数以上)確保して user namespace の UID 不足を防ぐ- ルートフル Docker と併用する場合は CLI の向き先(DOCKER_HOST)を明示し、誤って特権側に push しない
- cgroup v2 を有効にしたディストリビューション(Ubuntu 22.04+、RHEL 9+)を選ぶとリソース制限がフルに使える
注意点
- OverlayFS のネイティブ利用がカーネル 5.11 以前では制限され、fuse-overlayfs にフォールバックして IO が遅くなる場合がある
- ping がデフォルトで使えない(
net.ipv4.ping_group_rangeの調整が必要) - AppArmor / SELinux と組み合わせる場合、プロファイルがルートレス前提で書かれていないと起動失敗が起きる
--privilegedや--network=hostはルートレス環境では事実上使えない・機能が限られる- systemd サービスとして動かす場合は
loginctl enable-linger <user>を忘れるとログアウト時にデーモンが止まる
関連トピック
user namespace- コンテナ内の UID/GID をホスト側の別 UID/GID にマッピングする Linux の機能。これにより「コンテナ内では root、ホストから見ると非 root」を実現し、bind mount のパーミッション問題の根本原因にもなる。 capabilities- Linux の root 権限を約 40 の細かい能力に分割した仕組み。コンテナランタイムはデフォルトで一部だけを付与し、`--cap-drop` / `--cap-add` で絞り込む。最小権限の原則を徹底するための最重要機能。 --read-only- コンテナのルートファイルシステムを読み取り専用で起動し、書き込みが必要な部分だけ tmpfs や volume に分離する構成。マルウェアの書き込みや改ざんを防ぎ、Immutable Infrastructure を強化する。 