privileged

概述

默认情况下,Docker 容器是 "unprivileged "的,例如,无法在 Docker 容器内运行 Docker 守护进程。这是因为默认情况下,容器不允许访问任何设备,但 "特权 "容器可以访问所有设备。link

起因

在部署 openwrt 的时候遇到了这一个参数, 因为要使用 混杂模式(Promiscuous Mode)。

# 开启混杂模式
ip link set  ovs_eth0 promisc on

# 创建一个子网为192.168.10.1/24的虚拟网络,网关是192.168.10.1,名为ovs_lan
docker network create -d macvlan --subnet=192.168.10.1/24 --gateway=192.168.10.1  -o parent=ovs_eth0 ovs_lan

然后在 docker 容器部署的时候,让容器直接使用网卡。 从而能将容器独立出一个 ip 作为局域网网关使用。

在某一次远程连接出问题之后,我开始使用外接屏幕键盘的方式操作物理机。

但是操作的过程中 shell 的交互时常被另一个 BusyBox 的 shell 抢夺。

一开始以为是上次的入侵经历导致的这一问题,但是后续又成功用远程访问了,便开始排查这一问题。

最终在一个 openwrt 的容器中找到了 BusyBox 的 shell,其他信息也都对的上。

在询问了chatgpt之后给出了几种可能

  1. 键盘事件捕获: 可能有某个程序或脚本在运行,它把键盘事件同时发送给了本地 shell 和 Docker 容器的 shell。

  2. 终端多路复用: 如果您使用了像 tmux 或 screen 这样的终端多路复用工具,并且不知怎地配置得不当,可能会出现这样的问题。

  3. Docker 容器配置: 如果 Docker 容器以某种特殊的方式配置(例如,使用 --privileged 标志),并且以某种方式能够接收到主机上的键盘输入,这也可能导致该问题。

  4. 系统错误或 Bug: 最后的可能性是操作系统或 Docker 自身存在 bug,但这种可能性相对较小。

由此得知了 privileged 这个参数。

找到的参考资料

因为是比较少见的问题,相应的资料也不太多,只在GitHub上找到了几个issue

  1. "关于 --privileged参数占用前台的问题" link

  2. "docker 运行openwrt 为 host网络模式,直接给我宿主机界面接管了....." link

目前的解决方案

因为对docker的了解有限,准备过段时间尝试变更权限方式,看看可不可行。

在网上还没有找到太好的办法,只能 --restart=no 让容器在物理机重启后不再启动。

如果有找到好的办法,麻烦告诉我一下。