第18章:docker.sockを渡すと何が起きる?(だいたい最強権限)🐙🔥
いきなり結論!😇
/var/run/docker.sock をコンテナに渡す=そのコンテナに「Dockerデーモンを操作する権利」を渡すってことです。
そして Dockerデーモンは基本 “強い権限(root級)” で動くので、結果として ホストにかなり近いことまでできがちになります⚠️🐉
(Docker公式も「docker group が root級」って警告してます。方向性は同じ話です)(Docker Documentation)
この章のゴール🎯✨
docker.sockが 何者で、なぜ危険なのかを説明できる🙂- 「便利だから付ける」を卒業して、安全な代替を選べる🧠🔒
- どうしても必要なときに、被害半径を閉じ込める設計ができる📦🧱
まず docker.sock って何?🧩
docker.sock はざっくり言うと **Dockerクライアント(dockerコマンド)→ Dockerデーモンにお願いするための“通路”**です🚪
- 通常:ホストの
dockerコマンドが、このソケット経由でデーモンに話しかける🗣️ - 危険パターン:その通路を コンテナにも渡す → コンテナの中からでもデーモンにお願いできる😱
イメージ図🖼️✨
あなた(ホスト): docker ps ──▶ /var/run/docker.sock ──▶ Dockerデーモン(強い権限)
▲
│(これをコンテナに渡すと…)
コンテナ内: docker ps ────────┘ → ホストのDockerを操作できちゃう
何がマズいの?「できちゃうこと」が強すぎる💪😇→💥
docker.sock を触れるということは、だいたい次のことが可能になります👇
- コンテナ一覧を見る / 起動する / 停止する 🧯
- イメージを取る / ビルドする 🏗️
- ボリュームやネットワークを作る 🕸️
- そして最悪ライン: 「ホストに触れる設定のコンテナ」をデーモンに作らせる(=ホスト級)🐉🔥
Docker公式も「デーモンに触らせるのは危ないから保護しろ(TLSなど)」というスタンスです🔐(Docker Documentation) つまり “デーモン操作権”は、鍵束丸ごと渡すくらい重いです🔑💣
よくある「やりがち」シーン集(そして罠)🪤😵
1) 「コンテナの中から docker コマンド使いたい」🐳
テストで別コンテナ立てたい、e2eで依存サービスを増やしたい、などで出がち。
👉 でもその一手(docker.sock マウント)で、**テスト用コンテナが“司令塔”**になります📢😱
2) 「CIっぽくしたい(ローカルでGitHub Actionsの真似)」🏃♂️💨
便利だけど、ローカルの秘密やファイル共有が絡むと 漏れ経路が増える💦
3) AI拡張が提案してくる🤖🧨
AIが「簡単ですよ!」って -v /var/run/docker.sock:/var/run/docker.sock を出してきがち😇
ここで覚える合言葉:
“sock を渡す提案が出たら、赤信号🚨”(レビュー必須)🧑⚖️✅
重要ポイント:read-only でマウントしても安全にならない🙅♂️🔒
ファイル共有なら :ro が効きますが、**ソケットは“通路”**です🚪
通路がある限り、相手(デーモン)に「これやって」が言えちゃうので、本質的に危険度は落ちません😇💥
安全な代替案ベスト4🏆🔁(おすすめ順)
A) 「docker を使う処理」はホスト側で実行する🏠✅
一番シンプルで事故が少ないやつ!
- コンテナ内:ビルド成果物を作るだけ
- ホスト:
docker build/docker compose upを実行するだけ
👉 これだけで docker.sock を渡す理由が消えること、多いです🙂✨
B) “別のDocker”に閉じ込める(隔離専用のデーモン)📦🧱
「どうしてもコンテナ内からDocker操作したい」なら、 操作対象のDockerデーモンを“別物”にするのが強いです💪
例(考え方):
- ホストのDockerじゃなく、隔離用VM / 隔離用デーモンを操作する
- そうすると、壊れても “隔離箱の中だけ” で済む🧯
「リモートアクセスするならTLSで守れ」方針もこの流れです🔐(Docker Documentation)
C) “許可リスト式”のソケットプロキシを挟む🚧✅
docker.sock を直結せず、間にプロキシを置いて
「読むだけOK」「このAPIだけOK」みたいに できる範囲を削るやり方です✂️
代表例として、APIパスごとに許可/拒否を環境変数で切り替える実装があります🧰(GitHub) (※サードパーティなので、採用時は“信頼できるか”も含めて判断しよう🙂🔍)
D) Rootless など「デーモン側の権限」を落とす🧑🚀🔒
根本解決ではないけど、最悪の被害を減らす方向。 Docker自体も Rootless という道を用意してます。(Docker Documentation)
どうしても docker.sock が必要なときの「隔離専用コンテナ」設計🧱📦
やるなら、最低でもこの発想でいきます👇(事故りにくさ優先😇)
1) 役割を分ける(“sock担当”を分離)👥
- 通常アプリコンテナ:sock無し(絶対)🙅♂️
- 操作専用コンテナ:sock有り(最小機能・最小コード)✅
👉 “操作専用”は、小さく・短命に・監視しやすくするのがコツ🎯
2) 操作専用コンテナは「読むだけ」から始める👀
- いきなり作成/削除系を許すと、事故が派手になります💥
- まずは
psやinspectなど 参照用途だけで設計する🙂
3) “共有(bind mount)” とセットにしない🧨
sock + bind mount は、危険が乗算しがち😇💣
(第16章/17章の話がここで効いてくる!📎✨)
ミニ演習(安全な範囲で)🧪🙂
演習1:docker.sock を渡すと「ホストのDockerが見える」を体験👀
目的:**“権限が移る感覚”**を掴む!
dockerCLI が入った小さなコンテナを起動docker.sockを渡して、コンテナ内でdocker ps- ホスト側のコンテナ一覧が見えたら成功🎉
ポイント💡
- これだけで「中のコンテナ」ではなく **“外(ホスト)のDocker”**を触ってる感覚になるはず😇
(※ここでは危険な操作の具体例はやりません🙅♂️🔥 “見えるだけでも強い”が分かればOK!)
演習2:リポジトリから危険カードを検知する🔍🚨
目的:AI提案やコピペで混入しがちな設定を早期発見!
rg -n "docker\.sock|/var/run/docker\.sock|docker_engine" .
- 見つかったら、まずは **「本当に必要?」**を自問🧠
- 必要なら **「操作専用コンテナに隔離できる?」**を検討📦🧱
よくある詰まりポイント集😵💫🩹
Q1. 「権限エラーで docker.sock に繋がらない」
A. それは “勝手に触れない” 方向に倒れてるので、ある意味良い兆候😇 無理に権限を広げる前に、まず sock方式をやめられないかを検討しよう🔁
Q2. 「テストでどうしてもコンテナ増やしたい」
A. まずは代替案A(ホスト実行)→無理ならB(別Docker)→最後にC(プロキシ)って順に考えると事故りにくいよ🙂🏆
章末まとめ:docker.sock が出たらこのチェック✅😇
- それ、ホスト側で実行に寄せられない?🏠
- “sock付き”を アプリ本体から分離できてる?👥
- “sock付き”は 最小機能・短命・小さなコード?🪶
- bind mount とセットにしてない?(危険度UP)🧨
- 可能なら 別Docker / プロキシ / Rootless を検討した?🧱🔒
次の章(第19章)は、ボリュームの UID/GID(誰が書ける?) で「静かにデータが壊れる」系を潰していきます🗃️🛡️ この第18章が分かると、“操作権”と“データ権”を分離する発想が一気に強くなるよ💪😄✨