為 Docker 守護程序配置遠端訪問

預設情況下,Docker 守護程序在 Unix 套接字上偵聽連線,以接受來自本地客戶端的請求。您可以將 Docker 配置為透過偵聽 IP 地址和埠以及 Unix 套接字來接受來自遠端客戶端的請求。

警告

將 Docker 配置為接受來自遠端客戶端的連線可能會使您面臨主機未經授權的訪問和其他攻擊的風險。

至關重要的是,您需要了解向網路開放 Docker 的安全隱患。如果未採取措施保護連線,遠端非 root 使用者可能會獲得主機的 root 訪問許可權。

不推薦在沒有 TLS 的情況下進行遠端訪問,並且在將來的版本中將需要明確選擇加入。有關如何使用 TLS 證書保護此連線的更多資訊,請參閱保護 Docker 守護程序套接字

啟用遠端訪問

對於使用 systemd 的 Linux 發行版,您可以使用 docker.service systemd 單元檔案來啟用對守護程序的遠端訪問。或者,如果您的發行版不使用 systemd,您可以使用 daemon.json 檔案。

同時使用 systemd 單元檔案和 daemon.json 檔案來配置 Docker 偵聽連線會導致衝突,從而阻止 Docker 啟動。

使用 systemd 單元檔案配置遠端訪問

  1. 使用命令 sudo systemctl edit docker.service 在文字編輯器中開啟 docker.service 的覆蓋檔案。

  2. 新增或修改以下行,替換為您自己的值。

    [Service]
    ExecStart=
    ExecStart=/usr/bin/dockerd -H fd:// -H tcp://127.0.0.1:2375
  3. 儲存檔案。

  4. 重新載入 systemctl 配置。

    $ sudo systemctl daemon-reload
    
  5. 重啟 Docker。

    $ sudo systemctl restart docker.service
    
  6. 驗證更改是否已生效。

    $ sudo netstat -lntp | grep dockerd
    tcp        0      0 127.0.0.1:2375          0.0.0.0:*               LISTEN      3758/dockerd
    

使用 daemon.json 配置遠端訪問

  1. /etc/docker/daemon.json 檔案中設定 hosts 陣列以連線到 Unix 套接字和 IP 地址,如下所示

    {
      "hosts": ["unix:///var/run/docker.sock", "tcp://127.0.0.1:2375"]
    }
  2. 重啟 Docker。

  3. 驗證更改是否已生效。

    $ sudo netstat -lntp | grep dockerd
    tcp        0      0 127.0.0.1:2375          0.0.0.0:*               LISTEN      3758/dockerd
    

允許透過防火牆訪問遠端 API

如果您在執行 Docker 的同一臺主機上執行防火牆,並且希望從另一臺遠端主機訪問 Docker 遠端 API,則必須配置防火牆以允許 Docker 埠上的傳入連線。如果您使用 TLS 加密傳輸,預設埠是 2376,否則是 2375

兩種常見的防火牆守護程序是

請查閱您的作業系統和防火牆的文件。以下資訊可能有助於您入門。本說明中使用的設定是允許性的,您可能希望使用其他配置來更嚴格地鎖定您的系統。

  • 對於 ufw,在您的配置中設定 DEFAULT_FORWARD_POLICY="ACCEPT"

  • 對於 firewalld,將類似於以下的規則新增到您的策略中。一個用於傳入請求,一個用於傳出請求。

    <direct>
      [ <rule ipv="ipv6" table="filter" chain="FORWARD_direct" priority="0"> -i zt0 -j ACCEPT </rule> ]
      [ <rule ipv="ipv6" table="filter" chain="FORWARD_direct" priority="0"> -o zt0 -j ACCEPT </rule> ]
    </direct>

    確保介面名稱和鏈名稱是正確的。

附加資訊

有關遠端訪問守護程序配置選項的更詳細資訊,請參閱 dockerd CLI 參考