⭐️Docker: 特権コンテナ

特権コンテナとは

前提: コンテナは仮想マシンではなく、ホストと同じカーネルを共有した「ただのプロセス」。ホスト側で ps aux すれば見える。隔離しているのは、カーネルがそのプロセスに掛けている制限だけ。

ホスト(カーネルは1つ)
  └─ コンテナ = ただのプロセス
       ├ namespace   … 何が「見える」か(他プロセス / ファイル / ネットワーク)
       └ capability 他 … root として何が「できる」か(mount、ルーティング変更 …)

つまりコンテナは壁で囲まれた部屋ではなく、目隠し(namespace)と手錠(capability)をされたプロセス。--privileged は手錠だけ外す。

capability = 昔は「全部できる / 何もできない」の二択だった root を、約41枚の札に割ったもの。

ホストの root  [■■■■■■■■■■■■■■■■■■■■] 41枚
通常コンテナ   [■■■■■■■□□□□□□□□□□□□□] 14枚 ← mount の札が無い
特権コンテナ   [■■■■■■■■■■■■■■■■■■■■] 41枚
docker run --rm alpine mount -t tmpfs none /mnt              #=> permission denied(rootなのに)
docker run --rm --privileged alpine mount -t tmpfs none /mnt #=> 通る

危険な理由もここ。手錠が外れるとホストのディスクが見えて mount できる = mount /dev/sda1 /mnt の一発でホストのファイルを全部読み書きできる。

Docker-in-Dockerとは

コンテナの中で Docker デーモンを動かすこと(docker:dind)。デーモンは overlayfs を mount し、cgroup を作り、iptables を張るので --privileged が必要(公式 README に “required” と明記)。無しだと mount: permission denied で exit 1。

Cloud Runと特権コンテナ

使えない。 ランタイム契約に “There is no Cloud Run equivalent to Docker’s --privileged mode.” と明記。capability の付与も seccomp の差し替えも不可。

一言でいうと: Cloud Run は「コンテナを動かす場所」であって「コンテナを作る場所」ではない。