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

您必须在主机上安装newuidmapnewgidmap。这些命令由大多数发行版的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