docker exec的--privileged参数作用是什么?与-u 0有何区别?
这俩参数完全不是一个维度的东西,直接给你讲明白:
-u 0(或-u root):仅切换容器内的执行用户身份
这个参数的作用就是让你在容器里以root用户的身份运行命令,但这个root依旧是「容器隔离环境内的root」——它受容器本身的安全限制约束。比如容器启动时没开启特权模式,哪怕你用docker exec -u 0进入容器当root,也没法直接访问宿主机的/dev设备、加载内核模块,或者修改宿主机的系统参数,权限范围始终被限制在容器的隔离边界内。--privileged:为执行命令突破容器的隔离限制
这个参数是直接给你要执行的命令赋予「宿主机级别的特权」,和你用什么用户执行无关(当然如果操作本身需要root身份,还是得配合-u 0)。比如容器是普通模式启动的,你用docker exec --privileged bash进入容器后,就能直接挂载宿主机的磁盘分区、修改宿主机的内核参数,甚至操作宿主机硬件——相当于这条命令绕过了Docker的命名空间、cgroups等隔离机制,获得了和宿主机进程几乎一致的权限。
举个实际场景的例子:
如果容器是普通方式启动的,你执行docker exec -u 0 bash进入容器后,尝试运行mount /dev/sda1 /mnt会提示权限不足;但如果执行docker exec --privileged -u 0 bash进入容器,就能顺利完成宿主机磁盘分区的挂载操作。
简单总结:-u 0是切换容器内的用户身份,--privileged是给执行命令开放宿主机级特权,两者可以单独使用,也可以搭配起来达到「以容器root身份执行拥有宿主机特权的命令」的效果。
内容的提问来源于stack exchange,提问作者not2savvy

