如何在沒有 sudo 的情況下使用 Docker?

如何在沒有 sudo 的情況下使用 Docker?

在 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
    
  • 執行 anewgrp 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與添加$USERdocker組具有相同的效果。您仍然可以以有權root存取主機檔案系統的方式啟動容器。

警告2:ACL 的安全審核比基於群組的安全要困難得多。如果可以的話,當您可以使用群組時,可以避免使用 ACL,至少在稽核相關環境中是如此。

答案4

Docker 容器需要由超級使用者運作。您可以將自己新增至該docker群組(例如,透過執行sudo usermod -aG docker $USER),但這使得有權存取該$USER帳戶的任何人都可以輕鬆獲得對電腦的 root 存取權(例如,透過在特權容器中安裝根磁碟區)。

以非 root 使用者身分執行 Docker 容器的一種更具安全意識的方法是使用波德曼。從其網站:

Podman 是一個無守護程式容器引擎,用於在 Linux 系統上開發、管理和運行 OCI 容器。容器可以以 root 身分運行,也可以在無根模式。簡單的說:alias docker=podman

另一個選擇是奇點,更常部署在 HPC 環境中。

相關內容