天天看點

MacOS 等機器配置 Docker 啟用 Remote API

Docker 不僅可以通過本地指令行

docker

指令進行調用,還可以通過開啟遠端控制 API,使用 HTTP 調用接口來進行通路,遠端控制 Docker Daemon 來做很多操作。

安裝 Docker

如果沒有 Docker 可以先進行安裝:

# 國外主機
curl -sSL https://get.docker.com | sh

# 國内主機
curl -sSL https://get.daocloud.io/docker | sh           

啟用 API

Docker 的遠端 API 服務預設監聽的是 TCP 2375 端口,為了保證安全,Docker 安裝後預設不會啟用遠端 API 服務,因為這個服務預設不做權限認證。

如果你的防火牆或者安全組允許了 2375 端口通路,同時也開啟了 Docker 預設的遠端 API 服務,那麼大幾率你的伺服器會被拿來挖礦...

是以推薦在内網環境中使用,安全上會有保證,如果是外網生産環境建議做好

iptables

安全加強或用完即焚或使用 TLS 安全認證等等。

下面分别說明 CentOS 以及 MacOS 如何開啟遠端 API 服務:

CentOS

CentOS 的開啟方法比較簡單,先修改配置:

vim /usr/lib/systemd/system/docker.service           

修改

ExecStart

配置項,預設如下:

ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock           

增加一個

-H tcp://0.0.0.0:2375

選項

ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2375 --containerd=/run/containerd/containerd.sock           

如果是内網生産環境,也可以将

0.0.0.0

改為内網 IP。同樣的,2375 端口也可以修改。

但是這樣可能還有一個問題,無法在指令行使用

docker

指令了,還需要添加

sock

選項:

-H unix:///var/run/docker.sock

,最後為:

ExecStart=/usr/bin/dockerd -H fd:// -H unix:///var/run/docker.sock -H tcp://10.105.3.115:2375 --containerd=/run/containerd/containerd.sock           

修改完配置之後需要重新開機 Docker 服務:

systemctl daemon-reload
systemctl restart docker           

重新開機完成後,可以使用

netstat

檢視端口是否監聽來确認是否成功:

[root@VM-3-115-centos ~]# netstat -nutlp | grep 2375
tcp        0      0 10.105.3.115:2375       0.0.0.0:*               LISTEN      32316/dockerd           

MacOS

在 Mac 下無法直接修改配置檔案來開啟遠端 API 服務,後來在 docker/for-mac 的

issue

中得到了解決方案。

可以運作一個 socat 容器,将 unix socket 上的 Docker API 轉發到 MacOS 上指定的端口中:

docker run -d -v /var/run/docker.sock:/var/run/docker.sock -p 127.0.0.1:2375:2375 bobrik/socat TCP-LISTEN:2375,fork UNIX-CONNECT:/var/run/docker.sock           

測試

啟用成功後,可以進行一些測試,例如直接使用浏覽器通路

info

version

等頁面擷取資訊。

http://127.0.0.1:2375/info

http://127.0.0.1:2375/version           

這裡以

version

為例,通路後可以得到如下内容則表示啟用成功:

{
    "Platform": {
        "Name": "Docker Engine - Community"
    },
    "Components": [
        {
            "Name": "Engine",
            "Version": "20.10.7",
            "Details": {
                "ApiVersion": "1.41",
                "Arch": "amd64",
                "BuildTime": "2021-06-02T11:54:58.000000000+00:00",
                "Experimental": "false",
                "GitCommit": "b0f5bc3",
                "GoVersion": "go1.13.15",
                "KernelVersion": "5.10.25-linuxkit",
                "MinAPIVersion": "1.12",
                "Os": "linux"
            }
        },
        {
            "Name": "containerd",
            "Version": "1.4.6",
            "Details": {
                "GitCommit": "d71fcd7d8303cbf684402823e425e9dd2e99285d"
            }
        },
        {
            "Name": "runc",
            "Version": "1.0.0-rc95",
            "Details": {
                "GitCommit": "b9ee9c6314599f1b4a7f497e1f1f856fe433d3b7"
            }
        },
        {
            "Name": "docker-init",
            "Version": "0.19.0",
            "Details": {
                "GitCommit": "de40ad0"
            }
        }
    ],
    "Version": "20.10.7",
    "ApiVersion": "1.41",
    "MinAPIVersion": "1.12",
    "GitCommit": "b0f5bc3",
    "GoVersion": "go1.13.15",
    "Os": "linux",
    "Arch": "amd64",
    "KernelVersion": "5.10.25-linuxkit",
    "BuildTime": "2021-06-02T11:54:58.000000000+00:00"
}