[Docker] 掛載 /var/run/docker.sock 的用意?

[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,338 次)

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料