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

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

警告

將 Docker 配置為接受來自遠端客戶端的連線可能會使你容易受到對主機和其它攻擊的未經授權的訪問。

至關重要的是,你必須瞭解將 Docker 開啟到網路的安全隱患。如果沒有采取措施來保護連線,遠端非 root 使用者可能獲得主機上的 root 訪問許可權。

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

啟用遠端訪問

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

將 Docker 配置為同時使用 systemd 單位檔案和 daemon.json 檔案偵聽連線會導致衝突,從而阻止 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 埠上的傳入連線。預設埠為 2376(如果你使用 TLS 加密傳輸)或 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 參考