什么是无根 Docker?
通常,当您安装 Docker 时,它需要主机系统上的完全权限(root)。 这会产生潜在的安全问题,因为容器和(守护程序)Docker 服务都将以 root 身份运行。 在 Docker 的无 root 安装中,只有 Docker 守护进程以 root 身份运行,而容器以普通用户身份运行。
为什么这有关系? 因为如果在容器中运行的服务被破坏,攻击者也可能访问系统文件。 容器没有真正的隔离。
开源 播客项目 创建主要是为了在没有 root 的情况下运行容器。 这对 Docker 施加了压力,要求其支持类似的功能,以便容器以普通用户身份运行,但 Docker 服务(守护程序)以 root 身份运行。
这个无根安装现在可以从 Docker 本身获得,您不需要仅仅为了这个特性而使用 Podman。
在本文中,我将解释如何在没有 root 访问权限的情况下安装 Docker。 但在我向您展示这些步骤之前,让我们先讨论一下这种模式的缺点。
在无根模式下运行 Docker 的缺点
这种模式最大的缺点是网络,这些问题在 Podman 中也存在。
默认情况下,Docker 使用无根网络。
因为它是最快的,速度高达 30 Gbps,并且支持 IPv4 和 IPv6。
但它有问题。
容器不会有请求的外部IP,所有请求都会出现从127.0.0.1。
这是一个大问题,特别是如果您想设置限制分布式拒绝服务 (DDOS) 攻击的保护,因为所有请求似乎都来自同一个地址。
使用 Slirp4netns mode 解决了这个问题,并显示了请求的原始地址。 但它也有两个问题。
- 不支持 IPv6。
- 速度要慢得多(大约 7Gbps)。
先决条件
无根模式不使用粘性位。 他们需要 newuidmap 和 新gidmap.
这就是为什么您应该确保安装了 newuidmap 和 newgidmap 包(通过 uidmap 包)并且有 65,536 个子 ID。
newuidmap 验证调用者是由指示的进程的所有者 PID.
id -u
1001
whoami
testuser
接下来,检查用户是否有 65,536 个子 UID:
grep ^$(whoami): /etc/subuid
testuser:231072:65536
grep ^$(whoami): /etc/subgid
testuser:231072:65536
这些数字是什么意思? 第一个数字是允许使用的第一个 id,下一个数字告诉你有多少个 id。 为了 example,它以 231072 开头,id 0 表示 231072,id 1000 表示 241072。
安装 dbus-用户会话 和 fuse-overlayfs 包。
对于 Debian,使用命令安装 dbus-user-session:
sudo apt install -y dbus-user-session
然后安装 fuse-overlayfs:
sudo apt install -y fuse-overlayfs
建议使用 Kernel 5.11 或更高版本。
以无根模式安装 docker
现在你来到了主要部分。 第一部分是正常的 Docker 安装,然后是无根部分。
我将展示 Ubuntu 的步骤。
安装常用的 Docker 包
首先卸载任何现有的 Docker 包:
sudo apt remove docker docker-engine docker.io containerd runc
然后在 Ubuntu 上安装 Docker:
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io
通过运行 hello-world 映像来验证 Docker 引擎是否已正确安装。
sudo docker run hello-world
考虑到 Docker 守护进程已经在运行,请先禁用它。
sudo systemctl disable --now docker.service docker.socket
安装无根包
现在通过使用下载官方脚本来安装 docker-ce-rootless-extras 包 curl 命令:
curl -fsSL https://get.docker.com/rootless | sh
按照屏幕上的建议,您将安装无根 Docker。
在这个安装屏幕的最后,会写两件事: 出口=xxx
将它们复制并粘贴到最后一个 .bashrc 文件中,或者如果您使用的是 ZSH,则粘贴到 .zshrc 文件中。 获取刚刚更改的 rc 文件。
安装完成后,运行 daemon docker rootless:
systemctl --user start docker
每次启动时自动运行 rootless docker:
systemctl --user enable docker
sudo loginctl enable-linger $(whoami)
好好享受。
作者信息:Mead Naji 是一名 Web 开发人员和老式 Linux 开发人员。