Arch-Linux

守護程序執行時,為什麼我得到“無法連接到 Docker 守護程序”?

  • January 5, 2022

Docker 服務顯然正在執行:

$ systemctl status docker.service 
● docker.service - Docker Application Container Engine
  Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
  Active: active (running) since Mon 2015-12-28 19:20:50 GMT; 3 days ago
    Docs: https://docs.docker.com
Main PID: 1015 (docker)
  CGroup: /system.slice/docker.service
          └─1015 /usr/bin/docker daemon -H fd:// --exec-opt native.cgroupdriver=cgroupfs
$ ps wuf -u root | grep $(which docker)
root      1015  0.0  0.3 477048 12432 ?        Ssl   2015   2:26 /usr/bin/docker daemon -H fd:// --exec-opt native.cgroupdriver=cgroupfs

但是,Docker 本身拒絕與它交談:

$ docker info
Cannot connect to the Docker daemon. Is the docker daemon running on this host?

我正在執行預設的 Docker 配置,也就是說,我沒有更改任何/etc與此服務相關的文件。

這裡可能是什麼問題?

您需要將自己添加到docker並啟動組(通過註銷並再次登錄或執行newgrp docker)以執行docker命令。錯誤消息只是誤導。

這個問題已經得到解答,但這裡有一條額外的資訊。

無論您使用的是 Arch 還是 Fedora 或 Ubuntu 等其他發行版,Docker 都使用套接字文件進行通信。當您執行docker命令時,它使用此套接字與 Docker 守護程序通信。當然,守護程序必須正在執行(並且預設情況下它通常被禁用),但是如果您的使用者無法訪問套接字,它也將無法與守護程序通信。

您將首先從發行版的儲存庫中安裝 Docker。有些人下載安裝腳本並將其通過管道傳輸到 shell ( curl ... | sh),但建議從儲存庫安裝它,以便輕鬆更新。

拱:

# pacman -S docker

軟呢帽:

# dnf install docker

如上所述,預設情況下可能會禁用守護程序。如果要使用 Docker,則必須執行守護程序。

啟用它(因此它將在啟動時啟動):

# systemctl enable docker

立即啟動(或重新啟動):

# systemctl start docker

現在,預設情況下(如果缺少 docker 組),Docker 套接字由 root 擁有:

# ls -la /var/run/docker.sock
srw-rw---- 1 root root 0 Apr 28 17:22 /var/run/docker.sock

這就是普通使用者無法與 docker 守護程序對話的原因。普通使用者沒有足夠的權限訪問套接字。它無法訪問守護程序,因此它假定它沒有執行並顯示此錯誤:Cannot connect to the Docker daemon. Is the docker daemon running on this host?

這就是為什麼許多人簡單地以 root 身份啟動所有 Docker 命令,使用sudo. 但正如另一個答案中所述,Docker 有自己的機制,因此不需要使用 sudo 。

docker理想情況下,安裝 Docker 時會創建一個名為的組。但是,如果在啟動守護程序時該組不存在,則套接字文件歸根使用者所有。

在某些情況下,該組曾經有不同的名稱,例如dockerroot在 Fedora 上。檢查grep docker /etc/group您的系統上是否有這樣的組。如果您已經在使用該組(您的使用者在其中),則需要配置 Docker 以使用它:

/etc/sysconfig/docker中,添加-G dockerroot(注意:這是一種解決方法,不是最佳解決方案):

OPTIONS='--selinux-enabled -G dockerroot'

重新啟動守護程序後,您的使用者將能夠訪問套接字:

# systemctl restart docker
# ls -la /var/run/docker.sock
srw-rw---- 1 root dockerroot 0 Apr 28 17:32 /var/run/docker.sock

否則,官方的方式是使用名為docker. 如果存在,Docker會自動使用它,即將socket的組設置為那個組。如果它不存在,您需要做的就是創建它並重新啟動守護程序:

# groupadd docker
# systemctl restart docker

套接字文件將歸該組所有:

# srw-rw---- 1 root docker 0 Apr 28 17:42 /var/run/docker.sock

您的使用者必須在docker組中才能訪問套接字:

# usermod -aG docker (user)

您可能需要註銷並重新登錄(或su - (user)),執行id以查看您是否在組中。

然後,您可以在沒有 sudo/root 的情況下使用 Docker:

$ docker version --format '{{.Server.Version}}'
1.9.1

最後,一句警告。只有受信任的使用者才應該被允許控制你的 Docker 守護程序。請參閱https://docs.docker.com/engine/security/security/

(當然,對於 sudo 也是如此 - 只有受信任的使用者才應該在wheel組中。)

引用自:https://unix.stackexchange.com/questions/252684