守護程序執行時,為什麼我得到“無法連接到 Docker 守護程序”?
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
組中。)