如何解決“無法連接到 Docker 守護程序”錯誤
已發表: 2022-08-14Docker 是構建和運行軟件容器的領先平台之一。 它提供了在 Swarm 模式下在單個主機或多個分佈式節點上使用容器所需的一切。
Docker 有一個基於守護進程的架構。 負責創建和啟動容器的軟件獨立於接受您的命令的 CLI 進程。 這意味著如果您嘗試在沒有活動守護程序連接的情況下運行命令,您將在 CLI 中看到錯誤。 在本文中,我們將分享一些解決這些令人沮喪的消息的方法。
問題症狀
Docker CLI 依賴於可用的守護程序連接。 它使用 API 調用與守護進程交互。 當配置的守護進程無法訪問時,像docker ps
、 docker run
和docker 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 的套接字交互來解決錯誤。