【原创】Ubuntu 为非 root 用户添加 docker 用户组

概要

1、简介

我们在安装完 docker 后,使用普通用户运行 docker 的命令时都需要使用 sudo 来运行。这是因为 docker 需要使用到系统内核等较底层的资源。因此 dockerd 服务本身也是使用 root 用户运行的。

但是大多数人都知道 Linux 系统中 root 的权限过大,我们一般不建议使用,即便是管理员不是必要的时候也避免使用,因为防止出现误操作导致灾难性的问题。

因此,我们大数据情况都是使用一个具有 sudo 权限的普通用户来操作 docker,但这显得很麻烦且输入命令变多,如果有时忘了输入 sudo 就会出现类似如下权限拒绝的报错。

jiangzl@ubuntu:~$ docker images
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.40/images/json: dial unix /var/run/docker.sock: connect: permission denied

能否给我们的普通用户添加能够直接运行 docker 的权限呢?答案是肯定的,而且非常简单。

2、相关环境

Ubuntu 18.04.5
Docker 19.03.6

3、注意事项

以下内容均使用具有 sudo 权限的 jiangzl 普通用户操作。

正文

简单来说就是为非 root 用户添加一个 docker 的用户组中即可,以下的操作步骤:

1、验证是否有 docker 用户组

正常情况下,安装完 docker 后会自动创建一个 docker 的用户组,可以通过如下命令查看。

grep docker /etc/group

如下示例:

jiangzl@ubuntu:~$ grep docker /etc/group
docker:x:128:

如果有搜索到结果,就证明已经有 docker 用户组存在(不需要执行下面的创建用户组操作)。如果你天赋异禀,运气爆棚地发现确实没有这个用户组的话,那就自己创建一个 docker 用户组吧

sudo groupadd docker

2、添加非 root 用户到 docker 用户组

在具有 sudo 权限的用户命令行环境执行如下命令即可,其中 your-user 替换成需要添加到 docker 用户组的非 root 用户。

sudo usermod -aG docker your-user

如下示例,是将当前用户 jiangzl 添加到 docker 用户组

jiangzl@ubuntu:~$ sudo usermod -aG docker $USER
jiangzl@ubuntu:~$ id jiangzl
uid=1000(jiangzl) gid=1000(jiangzl) groups=1000(jiangzl),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),116(lpadmin),126(sambashare),128(docker)

$USER 是一个 Linux 的环境变量,表示的是当前用户的用户名。

如果是需要添加其他用户,改变后面的参数即可

sudo usermod -aG docker test

以上是将 test 用户添加到 docker 用户组

3、使用 groupmems 

sudo groupmems -g ${GROUP_NAME} -a ${USER_NAME}

注:执行上面的命令需要输入 root 的密码,使用具有 sudo 权限的用户执行此命令也需要输入 root 的密码,而不是前面账号的密码,切记。

jiangzl@ubuntu:~$ groupmems -g docker -a jiangzl
Password: 
jiangzl@ubuntu:~# id jiangzl
uid=1000(jiangzl) gid=1000(jiangzl) groups=1000(jiangzl),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),120(lpadmin),132(lxd),133(sambashare),134(docker)

4、重新登录 ssh 会话

你可能会发现,执行了上面的命令添加了用户到 docker 用户组怎么还是会报错呢?

jiangzl@ubuntu:~$ docker images
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.40/images/json: dial unix /var/run/docker.sock: connect: permission denied

这是因为当前 SSH Session 会话中的用户环境还没有 docker 用户组,退出 SSH 重新登录即可。

jiangzl@ubuntu:~$ id jiangzl
uid=1000(jiangzl) gid=1000(jiangzl) groups=1000(jiangzl),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),116(lpadmin),126(sambashare),128(docker)
jiangzl@ubuntu:~$ id
uid=1000(jiangzl) gid=1000(jiangzl) groups=1000(jiangzl),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),116(lpadmin),126(sambashare)

重启登录 SSH 后再次尝试。

jiangzl@ubuntu:~$ docker images
REPOSITORY           TAG                 IMAGE ID            CREATED             SIZE
kibana_v0.1          latest              016a70f54769        10 days ago         803MB
ubuntu               latest              4e2eef94cd6b        2 weeks ago         73.9MB
mysql/mysql-server   5.7                 9c31a29b3f30        8 weeks ago         322MB
kibana               6.7.0               a19f604cd838        17 months ago       675MB
elasticsearch        6.7.0               02982be5777d        17 months ago       810MB

成功搞定。

总结

1、docker 安装好以后一般都会自动创建 docker 用户组,不用再创建。

2、为用户添加 docker 用户组后,完全不必重启 docker 进程。注意这一点非常关键,因为如果你的 docker 已经运行了后台服务,重启 docker 服务肯定会对你的容器产生影响。因此,不要相信网上某些人的教程。

大家可以看一下,本身 dockerd 的进程就是 root 用户在运行,而你现在只是给一个普通用户添加了能获取 root 权限的用户组,它完全不会影响已经运行的 dockerd 进程。

jiangzl@ubuntu:~$ ps -ef | grep dockerd | grep -v grep
root      39423      1  0 21:58 ?        00:00:02 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

我上面的这些也是有 Docker 官网文档佐证的,官方文档地址如下:

https://docs.docker.com/engine/install/ubuntu/

可以看到官方文档写的是在添加了 docker 用户组后,记得 log out 并且 back in,这里的意思就是 log out ssh connection,back in 就是 back log in ssh connection。而且官方文档完全没有提到需要重启 dockerd 进程。此处请特别注意!!!

3、为用户添加 docker 用户组后一定要退出 SSH 会话后再登录以使 group 对 ssh session 生效。

4、添加 docker 用户组的警告

官方文档中也列出了相关警告,如果给一个普通用户添加了 docker 用户组,那么该用户就拥有了以 root 权限去运行容器的的能力。它可能会带来一些安全上的考虑

附录

参考

https://docs.docker.com/engine/install/ubuntu/
https://docs.docker.com/engine/security/security/#docker-daemon-attack-surface

You may also like...

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注