如何配置Docker以实现用户仅能停止自身启动的容器?
嘿,这个问题根源在于Docker默认的权限模型太宽松了——所有加入docker组的用户都拥有和root等价的Docker操作权限,所以用户B能随便停掉用户A启动的容器。下面给你两种可行的解决方案,适配你的Ubuntu 16.04和Docker 18.03环境:
方案一:标签标记+Sudo规则限制(轻量推荐)
这个方法的核心是给每个用户的容器打上专属标签,然后通过sudo规则锁死用户只能操作自己标签的容器,简单易上手。
步骤1:强制用户给容器打专属标签
首先,让每个用户启动容器时必须带上owner=$(whoami)的标签,比如:
docker run -d --label owner=$(whoami) nginx:latest
怕用户忘记?可以给他们的~/.bashrc加个自定义函数,直接覆盖默认的docker run命令:
# 编辑用户的~/.bashrc nano ~/.bashrc # 添加以下内容 function mydocker-run() { docker run --label owner=$(whoami) "$@" } alias docker-run=mydocker-run # 生效配置 source ~/.bashrc
这样用户执行docker-run就会自动给自己的容器打上owner标签,不用手动加。
步骤2:配置Sudo规则限制操作权限
接下来要限制用户只能操作自己的容器,编辑sudoers文件(一定要用visudo编辑,避免语法错误导致sudo失效):
sudo visudo
添加以下规则(把userA、userB换成你的实际用户名):
# 允许userA仅停止/删除自己的容器 userA ALL=(ALL) NOPASSWD: /usr/bin/docker stop $(/usr/bin/docker ps -q --filter label=owner=userA), /usr/bin/docker rm $(/usr/bin/docker ps -aq --filter label=owner=userA) # 允许userB仅停止/删除自己的容器 userB ALL=(ALL) NOPASSWD: /usr/bin/docker stop $(/usr/bin/docker ps -q --filter label=owner=userB), /usr/bin/docker rm $(/usr/bin/docker ps -aq --filter label=owner=userB)
这条规则的意思是:用户只能通过sudo执行docker stop和docker rm,而且只能操作带有自己owner标签的容器,别的容器碰不了。
步骤3:移除用户的docker组权限
最后,把用户从docker组里踢出去,彻底杜绝他们直接用docker命令操作别人的容器:
sudo gpasswd -d userA docker sudo gpasswd -d userB docker
之后用户必须通过sudo docker stop <容器ID>或者自定义的docker-run来操作容器。
方案二:Docker用户命名空间隔离(彻底隔离)
如果需要更彻底的隔离——比如用户之间完全看不到对方的容器、镜像,可以开启Docker的用户命名空间功能。
步骤1:开启用户命名空间
编辑Docker的配置文件/etc/docker/daemon.json(如果文件不存在就新建):
{ "userns-remap": "default" }
这个配置会让Docker自动创建一个dockremap用户组,把容器内的root用户映射到主机上的非特权用户,实现用户级别的隔离。
步骤2:重启Docker服务
sudo systemctl restart docker
开启后,每个用户只能看到和操作自己启动的容器,完全看不到别人的。不过要注意:这个方法会影响一些需要主机权限的容器(比如挂载主机目录),如果有这类需求,需要手动调整UID映射规则。
验证效果
让用户A启动一个容器,然后用用户B尝试停止:
# 用户A执行 docker-run -d nginx:latest # 用户B尝试停止(会提示权限不足) sudo docker stop <容器ID> # 只有用户A能停止自己的容器 sudo docker stop $(docker ps -q --filter label=owner=userA)
内容的提问来源于stack exchange,提问作者Franck Dernoncourt




