概述
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
用户组并添加用户:
- 创建
docker
用户组.
sudo groupadd docker
- 添加用户到
docker
用户组($USER 为用户名称).
sudo usermod -aG docker $USER
- 登出并重新登出,以便更新授权。在Linux系统上,可以执行以下命令来激活对组的修改:
newgrp docker
- 验证可以在不使用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守护进程时也不需要根权限,只要满足先决条件即可。
先决条件
- 必须在主机上安装
newuidmap
和newgidmap
。这些命令由大多数发行版上的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
。
已知限制
- 仅支持以下存储驱动:
overlay2
(仅当运行5.11或更高版本的内核,或 Ubuntu-flavored的内核,或 Debian-flavored的内核时)fuse-overlayfs
(仅当运行内核4.18或更高版本,并且安装了fuse-overlayfs
)btrfs
(只有在内核4.18或更高版本运行时,或者~/.local/share/docker
是用user_subvol_rm_allowed
挂载选项挂载的)vfs
- 只有在使用Cgroup v2和systemd运行时,才支持Cgroup。
- 不支持以下特性:
- AppArmor
- Checkpoint
- Overlay network
- 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)