docker@ubuntu下安装docker rootless
rootless模式允许以非root用户身份运行Docker守护程序和容器,以减轻守护程序和容器运行时中的潜在漏洞。只要满足先决条件,即使在Docker守护程序安装期间,无根模式也不需要root特权。无根模式是Docker Engine v19.03中引入的一项实验功能。无根模式从Docker Engine v20.10的实验中毕业。

无根模式在用户命名空间内执行Docker和容器。这与userns remap模式非常相似,只是在userns remmap模式下,守护进程本身以root权限运行,而在无根模式下,后台进程和容器都在没有root权限的情况下运行。
Rootless 模式利用 user namespaces 将容器中的 root 用户和 Docker 守护进程(dockerd)用户映射到宿主机的非特权用户范围内。Docker 此前已经提供了 –userns-[remap] 标志支持了相关能力,提升了容器的安全隔离性。Rootless 模式在此之上,让 Docker 守护进程也运行在重映射的用户名空间中。

参考:https://docs.docker.com/engine/security/rootless/
env
- Ubuntu 22.04 LTS
- docker-ce
- docker-rootless
1.前置条件
1.1创建普通用户
useradd -m -s /bin/bash testuser
1.2为普通用户配置sudo权限
echo 'testuser ALL=(ALL) NOPASSWD: ALL' > /etc/sudoers.d/testuser
chmod 440 /etc/sudoers.d/testuser
1.3切换到普通用户
su - testuser
您必须在主机上安装newuidmap和newgidmap。这些命令由大多数发行版的uidmap软件包提供。
sudo apt-get install -y uidmap
在/etc/suubid和/etc/subid中应至少包含用户的65536个从属UID/GID。在下面的示例中,用户testuser有65536个从属UID/GID(231072-296607)。
$ id -u
1001
$ whoami
testuser
$ grep ^$(whoami): /etc/subuid
testuser:231072:65536
$ grep ^$(whoami): /etc/subgid
testuser:231072:65536
特定于发行版的提示,如果未安装,请安装dbus-user-session软件包。默认情况下启用overlay2存储驱动程序。
sudo apt-get install -y dbus-user-session
2.安装docker
2.1正常流程安装docker-ce
sudo apt-get update -y
sudo apt-get install -y ca-certificates curl gnupg lsb-release
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update -y
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
2.2通过运行 hello-world 映像验证 Docker 引擎是否已正确安装。
sudo docker run hello-world
2.3禁用docker服务
sudo systemctl disable --now docker.service docker.socket
2.4配置环境变量
loginctl enable-linger $(whoami)
cat >>$HOME/.bashrc<<'EOF'
export XDG_RUNTIME_DIR=/run/user/$(id -u)
export DOCKER_HOST=unix://$XDG_RUNTIME_DIR/docker.sock
export PATH=/usr/bin:$PATH
EOF
source $HOME/.bashrc`
2.5安装rootless软件包
curl -fsSL https://get.docker.com/rootless | sh
2.5查看docker服务运行状态
testuser@ubuntu:~$ systemctl --user status docker
....
/run/user/1001/docker.sock"
2.6使用docker运行容器
docker run -d -p 8080:80 nginx
2.7查看容器内的用户id为0
testuser@ubuntu:~$ docker exec -it funny_noyce id -u
0
2.8查看进程用户id为165636
testuser@ubuntu:~$ ps -ef |grep nginx
testuser 69100 69077 0 22:31 ? 00:00:00 nginx: master process nginx -g daemon off;
165636 69148 69100 0 22:31 ? 00:00:00 nginx: worker process
165636 69149 69100 0 22:31 ? 00:00:00 nginx: worker process
testuser 69522 69369 0 22:52 pts/0 00:00:00 grep --color=auto nginx