Docker 容器中的 Root 用戶和密碼
一、概述
Docker的工作原理是將應用程序及其所有必需的依賴項打包到輕量級容器中。除了在測試時部署在本地集群上,我們還可以在生產環境中部署這些輕量級容器。
在本教程中,我們將研究使用不同用戶在 Docker 容器中執行命令。
首先,我們將學習使用 root 用戶訪問 Docker 容器以獲得一些額外的權限。我們還將討論為 root 和非 root 用戶設置密碼,以保護容器免受易受攻擊的來源的影響。
2. 設置一個 Docker 容器
在我們繼續之前,讓我們首先創建一個 Dockerfile 來添加一個用戶baeldung
:
FROM ubuntu:16.04
RUN apt-get update
RUN useradd -m baeldung
USER baeldung
CMD /bin/bash
在這裡,我們使用“ ubuntu:16.04
”作為基礎鏡像。讓我們使用docker build
命令構建鏡像:
$ docker build -t baeldung .
Sending build context to Docker daemon 2.048kB
Step 1/5 : FROM ubuntu:16.04
16.04: Pulling from library/ubuntu
58690f9b18fc: Pull complete
...
Step 5/5 : CMD /bin/bash
---> Running in d04af94585e2
Removing intermediate container d04af94585e2
---> 312faa93c781
Successfully built 312faa93c781
Successfully tagged baeldung:latest
我們現在將使用baeldung
映像運行 Docker 容器:
$ docker run -id --name baeldung baeldung
34dbc77279a2a6244b0e4ee87890d79e814128391c6a4387d2e2fd10fa6e8f20
讓我們使用docker ps
命令驗證容器是否按預期運行:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
34dbc77279a2 baeldung "/bin/sh -c /bin/bash" About a minute ago Up About a minute baeldung
在這裡,我們可以看到 Docker 容器正在運行,沒有任何問題。
3. 訪問 Docker 容器
Docker 容器旨在以 root 用戶身份訪問,以執行非 root 用戶無法執行的命令。我們可以使用docker exec
在正在運行的容器中運行命令。我們將使用docker exec
命令的-i
和-t
選項來獲取具有 TTY 終端訪問權限的交互式 shell。
3.1。使用非 root 用戶
Docker 容器“ baeldung
”已啟動並運行。我們現在將使用docker exec
命令來訪問它:
$ docker exec -it baeldung bash
仔細注意我們之前創建的 Dockerfile。我們添加了一個新用戶baeldung
,它被設置為使用該 Docker 映像運行的所有容器的默認用戶。讓我們使用whoami
命令驗證這一點:
$ whoami
baeldung
現在,如果我們嘗試將任何包安裝到容器中,我們將收到以下錯誤消息:
$ apt-get update
Reading package lists... Done
W: chmod 0700 of directory /var/lib/apt/lists/partial failed - SetupAPTPartialDirectory (1: Operation not permitted)
E: Could not open lock file /var/lib/apt/lists/lock - open (13: Permission denied)
E: Unable to lock directory /var/lib/apt/lists/
在這種情況下,非 root 用戶無法訪問lock
文件。通常,此用戶將具有對容器的受限訪問權限。
現在讓我們退出容器並使用 root 用戶重新登錄。
3.2.使用根用戶
為了在 Docker 容器中使用 root 用戶執行,我們將使用u
選項:
$ docker exec -it -u 0 baeldung bash
使用 docker exec 命令的“ -u”
docker exec
,我們定義了 root 用戶的id
。我們也可以在這個命令中使用用戶名:
$ docker exec -it -u root baeldung bash
為了檢查當前用戶的詳細信息,我們將運行whoami命令:
$ whoami
root
這一次,我們以 root 用戶身份進入容器。現在,我們可以對容器執行任何操作:
$ apt-get update
Hit:1 http://security.ubuntu.com/ubuntu xenial-security InRelease
Hit:2 http://archive.ubuntu.com/ubuntu xenial InRelease
Hit:3 http://archive.ubuntu.com/ubuntu xenial-updates InRelease
Hit:4 http://archive.ubuntu.com/ubuntu xenial-backports InRelease
Reading package lists... Done
從上面的輸出可以看出update命令成功,root用戶可以訪問lock
文件。有了 root 用戶的全部權限,我們可以毫無問題地更改任何文件。
作為替代方案,我們也可以以 root 身份訪問 Docker 容器。在這種情況下,我們將使用nsenter命令來訪問 Docker 容器。要使用nsenter命令,我們必須知道正在運行的容器的PID
。
我們來看一下獲取容器PID的命令:
$ docker inspect --format {{.State.Pid}} baeldung
6491
獲得PID
後,我們將PID
nsenter命令按以下方式使用此 PID:
$ nsenter --target 6491 --mount --uts --ipc --net --pid
這允許我們以 root 用戶身份訪問 Docker 容器並運行任何命令來訪問任何文件。
4. 在容器內使用sudo
命令
Docker 容器通常以 root 作為默認用戶運行。為了以不同的權限共享資源,我們可能需要在 Docker 容器中創建額外的用戶。
在這裡,我們將創建一個 Dockerfile 並添加一個新用戶。重要的是,我們還將在構建映像時在 Docker 容器中安裝sudo
包。當此用戶需要額外權限時,可以使用 s udo命令訪問這些權限。
讓我們檢查一下 Dockerfile:
FROM ubuntu:16.04
RUN apt-get update && apt-get -y install sudo
RUN useradd -m baeldung && echo "baeldung:baeldung" | chpasswd && adduser baeldung sudo
USER baeldung
CMD /bin/bash
此 Dockerfile 使用鏡像“ ubuntu:16.04 ”作為基礎鏡像,安裝sudo包,並創建一個新用戶“ baeldung ”。我們正在使用chpasswd
命令為baeldung
用戶添加密碼。之後,我們將其用作默認用戶。
讓我們運行命令來構建映像:
$ docker build -t baeldung .
上面的命令將創建baeldung
圖像。現在,讓我們使用baeldung
映像運行容器:
$ docker run -id --name baeldung baeldung
b0f83a7e8b49ddf043c80792f21d5c483c0c5ab56c700815a83b0a40e5292754
容器的默認用戶是baeldung
,所以我們將使用它來訪問容器:
$ docker exec -it baeldung bash
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.
讓我們運行whoami命令來找出登錄用戶的用戶名:
$ whoami
baeldung
這證實了我們以非 root 用戶身份登錄。如果我們運行apt-get update
命令,我們將遇到與第 3.2 節相同的權限相關問題。
這一次,我們將使用sudo命令來獲取非 root 用戶baeldung
的權限:
$ sudo apt-get update
[sudo] password for baeldung:
Get:1 http://security.ubuntu.com/ubuntu xenial-security InRelease [99.8 kB]
Hit:2 http://archive.ubuntu.com/ubuntu xenial InRelease
Get:3 http://archive.ubuntu.com/ubuntu xenial-updates InRelease [99.8 kB]
Get:4 http://archive.ubuntu.com/ubuntu xenial-backports InRelease [97.4 kB]
Fetched 297 kB in 1s (178 kB/s)
Reading package lists... Done
通過使用這種方法,我們可以使用sudo命令在非 root 帳戶中運行任何命令。
5. 結論
在本文中,我們演示瞭如何在具有不同用戶的 Docker 容器中運行命令。首先,我們討論了 root 和非 root 用戶在運行的 Docker 容器中的角色。然後,我們學習瞭如何以 root 用戶身份訪問 Docker 容器以獲得額外的權限。
理想情況下,我們不應該允許對 Docker 容器進行 root 訪問。這增加了更多的安全問題。相反,我們應該創建一個單獨的用戶來訪問容器。這是容器世界中的標準安全步驟。