[Docker] 掛載 /var/run/docker.sock 的用意?
最近在試 Docker Compose,
注意到有些人的 docker-compose.yml 裡面,
會掛載 /var/run/docker.sock 這個檔案,例如:
telegraf: container_name: telegraf image: telegraf restart: always volumes: - /var/run/docker.sock:/var/run/docker.sock - /sys:/rootfs/sys - /proc:/rootfs/proc - /etc:/rootfs/etc
但是,掛載 /var/run/docker.sock 要做什麼用呢?
上網查了一下,這篇 Docker Tips : about /var/run/docker.sock 講的蠻清楚的,
Docker daemon 平常會 listen 在 /var/run/docker.sock 這個 Unix Socket 上,
然後你可以對它送 HTTP 請求,就可以操作容器 (container),
像是要建立或啟動容器等等。
另一種用途,是用來監聽 Docker 的一些重要事件,
下面就用那篇文章的例子來實際跑一次。
首先啟動一個 alpine 的容器,
並將 /var/run/docker.sock 掛載到容器中:
docker run -it -v /var/run/docker.sock:/var/run/docker.sock alpine sh
在容器中安裝 curl:
apk update && apk add curl
接著用 curl 去連接 /var/run/docker.sock 這個 unix socket,
並送出請求給 http://localhost/events,這會取得 Docker 的所有事件:
curl --unix-socket /var/run/docker.sock http://localhost/events
執行上面指令後,假設再另外用 docker 啟動另一個容器,
剛剛的 curl 指令就會輸出一些以 JSON 格式包裝的事件,
像是 container create, container attach, network connect, container start 等等:
{ "status": "create", "id": "38ae67914667b6a9e5a6c652e579e354158499d9c75d3127e80cfad4c39b6f38", "from": "alpine", "Type": "container", "Action": "create", "Actor": { "ID": "38ae67914667b6a9e5a6c652e579e354158499d9c75d3127e80cfad4c39b6f38", "Attributes": { "image": "alpine", "name": "unruffled_heisenberg" } }, "scope": "local", "time": 1610127474, "timeNano": 1610127474520951700 } { "status": "attach", "id": "38ae67914667b6a9e5a6c652e579e354158499d9c75d3127e80cfad4c39b6f38", "from": "alpine", "Type": "container", "Action": "attach", "Actor": { "ID": "38ae67914667b6a9e5a6c652e579e354158499d9c75d3127e80cfad4c39b6f38", "Attributes": { "image": "alpine", "name": "unruffled_heisenberg" } }, "scope": "local", "time": 1610127474, "timeNano": 1610127474526130800 } { "Type": "network", "Action": "connect", "Actor": { "ID": "6f8b82ee6ef2bbf21978dc1f0cae88d7893b2b55a7f51e697e7253bff65bf260", "Attributes": { "container": "38ae67914667b6a9e5a6c652e579e354158499d9c75d3127e80cfad4c39b6f38", "name": "bridge", "type": "bridge" } }, "scope": "local", "time": 1610127474, "timeNano": 1610127474558976300 } { "status": "start", "id": "38ae67914667b6a9e5a6c652e579e354158499d9c75d3127e80cfad4c39b6f38", "from": "alpine", "Type": "container", "Action": "start", "Actor": { "ID": "38ae67914667b6a9e5a6c652e579e354158499d9c75d3127e80cfad4c39b6f38", "Attributes": { "image": "alpine", "name": "unruffled_heisenberg" } }, "scope": "local", "time": 1610127474, "timeNano": 1610127474894247800 }
也就是說,掛載了 /var/run/docker.sock 的容器,
就有了操控 Docker daemon 的能力,
因此對某些容器提供的服務而言,是必要的。
但如果非必要的話,就不要掛載,以免給予容器不必要的權限囉~
(本頁面已被瀏覽過 5,365 次)