Error when creating a network namespace inside a docker container. error: mount --make-shared /run/netns failed: Permission denied

Error when creating a network namespace inside a docker container. error: mount --make-shared /run/netns failed: Permission denied

我在 docker 容器内创建网络名称空间时遇到错误,提示权限被拒绝。

command  
ip netns add red
error
mount --make-shared /run/netns failed: Permission denied

我是 运行 图像 ubuntu:20.10 并尝试向容器添加特定功能但没有帮助。

docker run -it --rm --name=ubuntu --cap-add CAP_SYS_ADMIN --cap-add NET_ADMIN ubuntu:20.10
apt-get update && apt-get install -y net-tools && apt-get install -y iproute2

即使添加了所有功能,问题仍然存在。

docker run -it --rm --name=ubuntu --cap-add ALL ubuntu:20.10

--cap-add & --privileged 不一样。
参考:https://docs.docker.com/engine/reference/run/#runtime-privilege-and-linux-capabilities

问题按 运行 具有特权的容器排序。添加网络名称空间似乎不需要功能。

docker run -d --name=<name> --network=none --privileged <image>:<tag>

另一个答案建议添加 --privileged,但请注意,添加 --privileged 会有效地删除所有安全功能。如果您对此感到不舒服,您可能更喜欢一种只允许容器访问其所需内容的方法。

根本原因是 Docker 的 default apparmor profile contains the rule deny mount 阻止 mount 在 Docker 容器内工作,这就是导致错误消息的原因 mount --make-shared /run/netns failed: Permission denied.

您可以通过在您的命令中添加 --security-opt apparmor=unconfined 来确认这一点,这会禁用 apparmor,并注意 mount 命令成功。

docker run -it --rm --name=ubuntu \
  --cap-add CAP_SYS_ADMIN --cap-add NET_ADMIN \
  --security-opt apparmor=unconfined \
  ubuntu
apt-get update && apt-get install -y net-tools iproute2
ip netns add red # succeeds

如果您不想完全退出 apparmor,您可以创建自定义 apparmor 配置文件,然后使用 apparmor_parser -r -W path/to/your/profile 加载它,然后使用 --security-opt apparmor=your-profile-name 加载它。您可以通过复制 Docker 的模板然后调整它以满足您的需要来创建自定义 apparmor 配置文件。

在撰写本文时,Docker does not have an easy way to show the apparmor profile it is currently using, but you can look at the source template然后手动展开模板(按照模板逻辑)。

https://docs.docker.com/engine/security/apparmor/