特権コンテナとは
前提: コンテナは仮想マシンではなく、ホストと同じカーネルを共有した「ただのプロセス」。ホスト側で 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 は「コンテナを動かす場所」であって「コンテナを作る場所」ではない。