在 docker 容器内创建网络命名空间时出错。错误:挂载 --make-shared /run/netns 失败:权限被拒绝

Isu*_*nga 7 ubuntu docker-network

在 docker 容器内创建网络命名空间时出现错误,提示权限被拒绝。

command  
ip netns add red
Run Code Online (Sandbox Code Playgroud)
error
mount --make-shared /run/netns failed: Permission denied
Run Code Online (Sandbox Code Playgroud)

我正在运行图像 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
Run Code Online (Sandbox Code Playgroud)

即使添加所有功能后,问题仍然相同。

docker run -it --rm --name=ubuntu --cap-add ALL ubuntu:20.10
Run Code Online (Sandbox Code Playgroud)

Tre*_*ing 6

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

根本原因是 Docker 的默认 apparmor 配置文件deny mount包含阻止在 Docker 容器内工作的规则mount,这就是导致错误消息的原因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
Run Code Online (Sandbox Code Playgroud)

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

在撰写本文时,Docker 没有一种简单的方法来显示它当前使用的 apparmor 配置文件,但您可以查看源模板,然后手动扩展模板(按照模板逻辑)。

请参阅https://docs.docker.com/engine/security/apparmor/


Isu*_*nga 2

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

通过以特权运行容器来对问题进行排序。添加网络命名空间似乎不需要功能。

docker run -d --name=<name> --network=none --privileged <image>:<tag>
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述