以非root用户运行Docker

小小码农 2021年08月24日 1,972次浏览

概述

Docker守护进程绑定到Unix scoket(Unix套接字)而不是TCP端口。默认情况下,Unix套接字属于root用户,其他用户只能使用sudo访问它。Docker守护进程始终以root用户运行。
如果您不想在docker命令之前加上sudo前缀命令,那么有两种方式可以处理这种情况。

  • 1.在linux系统中创建docker用户组,将用户添加至该用户组中
    docker用户组授权后等价于root用户,守护进程和容器都使用根权限运行,权限太大,有安全隐患的问题。
  • 2.使用Rootless mode(无root模式、无根模式)。
    无根模式是在Docker Engine v19.03中作为实验特性引入的,稳定版是Docker Engine v20.10,在无根模式下,守护进程和容器都不使用根权限运行,提高了安全问题。

1.添加用户组 方式

创建docker用户组并添加用户:

  1. 创建 docker用户组.
sudo groupadd docker
  1. 添加用户到docker用户组($USER 为用户名称).
sudo usermod -aG docker $USER
  1. 登出并重新登出,以便更新授权。在Linux系统上,可以执行以下命令来激活对组的修改:
newgrp docker
  1. 验证可以在不使用sudo的情况下运行docker命令(使用授权用户登录系统)
docker run hello-world

如果您在将用户添加到Docker组之前,首先使用sudo运行过Docker CLI命令,您可能会看到以下错误,这表明您的~/.docker/目录由于sudo命令创建的权限不正确。

WARNING: Error loading config file: /home/user/.docker/config.json -
stat /home/user/.docker/config.json: permission denied

要解决这个问题,可以删除~/.docker/目录(它会自动重新创建,但任何自定义设置都会丢失),或者使用以下命令更改其所有权和权限:

sudo chown "$USER":"$USER" /home/"$USER"/.docker -R
sudo chmod g+rwx "$HOME/.docker" -R

$USER 为刚刚添加到docker用户组的用户名

可以查看Linux的安装后步骤来访问更多针对于docker在linux下的相关后续配置

2.Rootless mode 方式

无根模式允许以非根用户的身份运行Docker守护进程和容器,以减少守护进程和容器运行时中的潜在漏洞。
无根模式即使在安装Docker守护进程时也不需要根权限,只要满足先决条件即可。

先决条件

  • 必须在主机上安装newuidmapnewgidmap。这些命令由大多数发行版上的uidmap包提供。
  • /etc/subuid/etc/subgid应该至少包含65,536个用户的下级UIDs/GIDs。在下面的示例中,用户testuser拥有65,536个从属UIDs/GIDs(231072-296607)。

官方建议使用Ubuntu内核。

$ id -u
1001
$ whoami
testuser
$ grep ^$(whoami): /etc/subuid
testuser:231072:65536
$ grep ^$(whoami): /etc/subgid
testuser:231072:65536

我的系统是CentOS 7的,所以针对该系统,需要一些其他配置(除了Ubuntu内核,其它系统内核都需要不同的改动)

  • user.max_user_namespaces=28633添加到/etc/sysctl.conf文件中(或者添加到/etc/sysctl.d),然后运行命令sudo sysctl --system
  • systemctl --user 默认情况下不工作。在没有systemd的情况下直接运行dockerd-rootless.sh

已知限制

  • 仅支持以下存储驱动:
  1. overlay2(仅当运行5.11或更高版本的内核,或 Ubuntu-flavored的内核,或 Debian-flavored的内核时)
  2. fuse-overlayfs(仅当运行内核4.18或更高版本,并且安装了fuse-overlayfs)
  3. btrfs(只有在内核4.18或更高版本运行时,或者~/.local/share/docker是用user_subvol_rm_allowed挂载选项挂载的)
  4. vfs
  • 只有在使用Cgroup v2和systemd运行时,才支持Cgroup。
  • 不支持以下特性:
  1. AppArmor
  2. Checkpoint
  3. Overlay network
  4. Exposing SCTP ports
  • 公开特权TCP/UDP端口(< 1024)
  • IPAddress显示在docker inspect中,命名空间在RootlessKit的网络命名空间中。这意味着如果没有nsenter-ing到网络命名空间,主机就无法访问IP地址。
  • 主机网络(docker run --net=host)的命名空间也在RootlessKit中。
  • 不支持NFS作为docker"data-root"挂载。这个限制并不特定于无根模式。

安装

如果使用RPM/DEB包安装了Docker 20.10或更高版本,那么应该在/usr/bin中存在dockerd-rootless-setuptool.sh脚本文件。
以非root用户执行dockerd-rootless-setuptool.sh install命令。
如果dockerd-rootless-setuptool.sh不存在,可能需要手动安装docker-ce-rootless-extras包,例如:

sudo yum install -y docker-ce-rootless-extras

更多Rootless mode的用户请参考Run the Docker daemon as a non-root user (Rootless mode)