Docker 是 client-server 架構,CLI 只是遙控器
你打的每一個
docker指令,自己什麼都沒做,只是送一個 REST API request 給 Daemon。搞清楚三個角色,很多困惑會自動消失。
三個角色
- Docker CLI — 把指令翻成 HTTP request 送出去,本身不跑容器
- Docker Daemon(dockerd) — 真正扛重活的:building / running / distributing
- Registry — Image 的遠端倉庫,預設 Docker Hub
溝通走 UNIX socket(/var/run/docker.sock)或網路介面,所以 Docker 的所有功能都能用 HTTP 直接呼叫:
curl --unix-socket /var/run/docker.sock http://localhost/containers/json # 等同 docker ps
export DOCKER_HOST="ssh://user@my-server.com" # CLI 控制遠端 daemon
docker context create prod --docker "host=ssh://user@my-server.com"它解釋了什麼
- 為什麼要開著 Docker Desktop 才能用指令 — 它在背景跑 Daemon,關掉就
Cannot connect to the Docker daemon - 為什麼 Dockerfile 看不到你整台電腦 — build 是 Daemon 做的,它只看得到你上傳的 build context
- Portainer、GUI、CI 工具憑什麼能管你的容器 — 全都只是同一個 REST API 的另一種 client
- Docker Compose 也是一種 client,不是另一個引擎,跟 CLI 平起平坐
🚨 docker.sock 等於主機 root
能存取這個 socket 的人,就能開一個掛載主機根目錄的特權容器,等於拿到主機 root。所以不要隨便把 docker.sock 掛進容器(很多 CI 教學這樣做),也不要把 daemon 的 TCP port 裸奔在公網(必須開的話一定要 TLS 驗證)。