
在 Docker 的文件頁面上,所有範例指令均不帶sudo
,如下所示:
docker ps
在 Ubuntu 上,該二進位檔案稱為docker.io
.如果沒有:它也無法運作sudo
:
sudo docker.io ps
如何配置 Docker,以便不需要為每個 Docker 命令添加前綴sudo
?
答案1
好消息:新的 Docker 版本 19.03(目前處於實驗階段)將能夠無 root 運行,從而消除使用 root 使用者可能出現的問題。不再需要搞亂提升的權限、root 以及任何可能在您不希望的情況下打開您的電腦的內容。
有關此內容的影片來自[DockerCon 2019] 使用 Rootless 模式強化 Docker 守護程式
無根 Docker 模式的一些注意事項
Docker 工程師表示,無根模式不能被視為取代整套 Docker 引擎功能。無根模式的一些限制包括:
- cgroups 資源控制、apparmor 安全設定檔、檢查點/復原、覆蓋網路等不適用於無根模式。
- 目前從容器公開連接埠需要手動 socat 輔助進程。
- 只有基於 Ubuntu 的發行版支援無根模式下的覆蓋檔案系統。
- 目前,無根模式僅適用於夜間構建,可能不如您習慣的那麼穩定。
從 Docker 19.3 開始,這已經過時了(而且比需要的更危險):
這Docker手冊對此有這樣的說法:
授予非 root 存取權限
docker 守護程式始終以 root 使用者身分執行,從 Docker 版本 0.5.2 開始,docker 守護程式綁定到 Unix 套接字而不是 TCP 連接埠。預設情況下,Unix 套接字由使用者 root 擁有,因此預設情況下,您可以使用 sudo 存取它。
從版本0.5.3 開始,如果您(或您的Docker 安裝程式)建立一個名為docker 的Unix 群組並向其中新增用戶,則docker 守護程式將在守護程式啟動時使Unix 套接字的所有權由docker組讀/寫。 docker 守護程式必須始終以 root 使用者身分執行,但如果您以 docker 群組中的使用者身分執行 docker 用戶端,則無需將 sudo 新增至所有用戶端命令。從 0.9.0 開始,您可以使用 -G 選項指定除 docker 之外的群組擁有 Unix 套接字。
警告:docker 群組(或使用 -G 指定的群組)與 root 等效;看Docker 守護程序攻擊面詳細信息以及這篇博文為什麼我們不允許非 root 使用者在 CentOS、Fedora 或 RHEL 中執行 Docker(感謝麥可-n)。
在最近發布的GitHub 上的實驗性無根模式工程師提到無根模式允許使用 user_namespaces(7)、mount_namespaces(7)、network_namespaces(7) 以非特權使用者執行 dockerd。
使用者需要執行 dockerd-rootless.sh 而不是 dockerd。
$ dockerd-rootless.sh --experimental
由於 Rootless 模式是實驗性的,因此使用者需要始終使用 –experimental 來執行 dockerd-rootless.sh。
重要閱讀:Linux 的安裝後步驟(它還連結到Docker 守護程序攻擊面詳細信息)。
以非 root 使用者身分管理 Docker
docker 守護程式綁定到 Unix 套接字而不是 TCP 連接埠。預設情況下,Unix 套接字由使用者 root 擁有,其他使用者只能使用 sudo 存取它。 docker 守護程式始終以 root 使用者身分執行。
如果您不想在使用 docker 命令時使用 sudo,請建立一個名為 docker 的 Unix 群組並在其中新增使用者。當 docker 守護程式啟動時,它會使 Unix 套接字的所有權可由 docker 群組讀取/寫入。
新增該
docker
群組(如果尚不存在):sudo groupadd docker
將連接的用戶「$USER」加入到
docker
群組中。如果您不想使用目前用戶,請變更用戶名以符合您的首選用戶:sudo gpasswd -a $USER docker
執行 a
newgrp docker
或登出/登入以啟動對群組的變更。您可以使用
docker run hello-world
檢查是否可以在沒有
sudo
.
答案2
要在沒有 的情況下執行 docker 命令sudo
,您需要將您的使用者(具有 root 權限)新增至 docker 群組。為此,請執行以下命令:
sudo usermod -aG docker $USER
現在,讓用戶登出然後再次登入。這個解決方案很好解釋這裡具有正確的安裝過程。
答案3
將使用者新增至群組授予執行 docker 權限的機制docker
是存取 docker 的套接字/var/run/docker.sock
。如果包含的檔案系統/var/run
已在啟用 ACL 的情況下掛載,則也可以透過 ACL 來實現。
sudo setfacl -m user:$USER:rw /var/run/docker.sock
我只是為了完整性才將其包括在內。
一般來說,只要有基於群組的良好替代方案可用,我建議避免使用 ACL:如果可以僅透過查看群組成員資格來了解系統中的權限,那就更好了。必須掃描檔案系統中的 ACL 條目才能了解系統權限,這是安全審核的額外負擔。
警告1:這root
與添加$USER
到docker
組具有相同的效果。您仍然可以以有權root
存取主機檔案系統的方式啟動容器。
警告2:ACL 的安全審核比基於群組的安全要困難得多。如果可以的話,當您可以使用群組時,可以避免使用 ACL,至少在稽核相關環境中是如此。
答案4
Docker 容器需要由超級使用者運作。您可以將自己新增至該docker
群組(例如,透過執行sudo usermod -aG docker $USER
),但這使得有權存取該$USER
帳戶的任何人都可以輕鬆獲得對電腦的 root 存取權(例如,透過在特權容器中安裝根磁碟區)。
以非 root 使用者身分執行 Docker 容器的一種更具安全意識的方法是使用波德曼。從其網站:
Podman 是一個無守護程式容器引擎,用於在 Linux 系統上開發、管理和運行 OCI 容器。容器可以以 root 身分運行,也可以在無根模式。簡單的說:
alias docker=podman
。
另一個選擇是奇點,更常部署在 HPC 環境中。