如何解決“無法連接到 Docker 守護程序”錯誤

已發表: 2022-08-14

顯示 Docker 徽標的圖形

Docker 是構建和運行軟件容器的領先平台之一。 它提供了在 Swarm 模式下在單個主機或多個分佈式節點上使用容器所需的一切。

Docker 有一個基於守護進程的架構。 負責創建和啟動容器的軟件獨立於接受您的命令的 CLI 進程。 這意味著如果您嘗試在沒有活動守護程序連接的情況下運行命令,您將在 CLI 中看到錯誤。 在本文中,我們將分享一些解決這些令人沮喪的消息的方法。

問題症狀

Docker CLI 依賴於可用的​​守護程序連接。 它使用 API 調用與守護進程交互。 當配置的守護進程無法訪問時,像docker psdocker rundocker build這樣的docker命令將顯示類似於以下的錯誤消息:

 $ docker run hello-world:latest
無法連接到 unix:///var/run/docker.sock 上的 Docker 守護程序
docker 守護進程是否正在運行?

這表明 CLI 嘗試使用/var/run/docker.sock Unix 套接字與 Docker 守護進程通信。 套接字未打開,因此連接失敗。

1. 檢查 Docker 守護程序服務是否正在運行

Docker 守護進程通常由 systemd 服務管理,該服務會在主機重啟後自動啟動 Docker。 您可以通過檢查此服務是否正在運行來開始故障排除:

 $ sudo systemctl 狀態泊塢窗
docker.service - Docker 應用程序容器引擎
     已加載:已加載(/lib/systemd/system/docker.service;已啟用;供應商預設:已啟用)
     活躍:不活躍(死)

如果守護程序正在運行,服務應該報告Active: active (running) 。 上面的示例顯示了inactive (dead) ,這意味著守護程序已停止。

使用以下命令啟動 Docker:

 $ sudo systemctl 啟動泊塢窗

現在您應該能夠成功運行docker CLI 命令。

重新啟動機器後,您可能會發現 Docker 仍處於停止狀態。 您可以通過啟用該服務來解決此問題,允許 systemd 自動啟動它:

 $ sudo systemctl 啟用泊塢窗
$ sudo systemctl 守護進程重載

daemon-reload命令指示 systemd 重新加載其配置以應用更改。

2.手動啟動守護進程

您有時可能會使用未安裝 Docker 服務的系統。 您可以使用dockerd命令手動啟動 Docker 守護程序。 這通常需要以root身份運行。

 $ sudo dockerd
信息[2022-06-29T15:12:49.303428726+01:00] 啟動

只要命令正在運行,Docker 將保持可訪問性。 使用 Ctrl+C 停止守護程序。

3. 檢查 CLI 是否針對正確的守護進程

當 CLI 嘗試連接到遠程 Docker 守護程序實例時,可能會出現問題。 這通常是錯誤消息顯示 TCP 地址的原因:

 $ docker run hello-world:latest
無法在 tcp:///0.0.0.0:2375 連接到 Docker 守護進程

在此示例中, docker CLI 嘗試使用 TCP 而不是本地 Unix Docker 套接字在0.0.0.0:2375聯繫 Docker 守護程序。 如果 Docker 守護進程的 TCP 支持被禁用或指定的主機在網絡上不可訪問,這將失敗。

您通常可以通過切換到要使用的守護程序連接的正確 Docker CLI 上下文來解決此問題:

 $ docker 上下文使用默認值

您可以使用context ls命令列出所有可用的上下文和它們連接的守護程序端點:

 $ docker 上下文 ls
名稱 描述 Docker 端點             
默認 * 當前基於 DOCKER_HOST 的配置 unix:///var/run/docker.sock

當前選定的上下文以星號突出顯示。

DOCKER ENDPOINT列中的意外值通常是由設置的DOCKER_HOST環境變量引起的。 在這種情況下,您會看到警告:

 $ 出口 DOCKER_HOST=1.2.3.4
$ docker 上下文 ls
名稱 描述 Docker 端點
默認 * 當前基於 DOCKER_HOST 的配置 tcp://1.2.3.4:2375
警告:DOCKER_HOST 環境變量會覆蓋活動上下文。 要使用上下文,請設置全局 --context 標誌,或取消設置 DOCKER_HOST 環境變量。

您的 shell 中存在的DOCKER_HOST環境變量會覆蓋由您選擇的上下文定義的端點。 在此示例中, docker命令將始終以tcp://1.2.3.4:2375的守護程序實例為目標。

這個問題可以通過清除DOCKER_HOST變量來解決:

 $ 出口 DOCKER_HOST=

Docker 現在將使用您的活動上下文配置的端點。 這將是/var/run/docker.sock中的默認本地 Unix 套接字,除非您手動設置了自定義上下文。

 $ docker 上下文 ls
名稱 描述 Docker 端點             
默認 * 當前基於 DOCKER_HOST 的配置 unix:///var/run/docker.sock

4.權限問題

Docker 套接字上的用戶權限不正確是守護程序連接問題的另一個常見原因。 這類問題通常會顯示稍有不同的錯誤信息:

 $ docker run hello-world:latest
嘗試在 unix:///var/run/docker.sock 連接到 Docker 守護進程套接字時獲得權限被拒絕

當您的 Unix 用戶帳戶缺乏與公開 Docker API 的套接字交互的權限時,就會發生這種情況。 將自己添加到docker組是解決此問題的最佳實踐方法:

 $ sudo usermod -aG docker $USER

您需要打開一個新的 shell 窗口或註銷並重新登錄才能使此更改生效。 您現在應該能夠運行docker命令而不會遇到權限問題。

概括

當 Docker CLI 無法使用當前配置與 Docker 守護程序實例通信時,會出現“無法連接到 Docker 守護程序”。 這通常是因為 Docker 守護程序服務已停止或禁用。 您還可能嘗試連接到離線的遠程 Docker 主機。

您現在應該了解此問題的可能原因以及解決此問題的常用方法。 通過檢查您的 Docker 守護程序設置、重新啟動 Docker 服務並確保您的用戶帳戶有權與 Docker 的套接字交互來解決錯誤。