为什么 cap_net_bind_service 不能在这个 nginx 嵌套的 Docker 容器中工作?

Why is cap_net_bind_service not working in this nginx nested Docker container?

Kubernetes 的 nginx ingress controller 使用 cap_net_bind_service 功能,这是一个 Linux 文件系统属性,以获得打开特权端口(端口 80)的权限。但是,我有一个测试使用 docker 容器作为虚拟节点(docker inside docker)创建一个本地 Kubernetes 集群,并启动一个 nginx 入口控制器 pod。此控制器在 Windows 10 上的 Docker 桌面上工作正常,但是当我 运行 在 Linux 上进行相同测试时,控制器在启动时反复崩溃,其中:

[17:27:34]nginx: [emerg] bind() to 0.0.0.0:80 failed (13: Permission denied)

但嵌套的 Docker 容器中存在所需的功能:

$ allpods=$(kubectl get pods)
$ ingresspod=$(echo "$allpods"|grep '^nginx-ingress-controller'|head -n1)
$ kubectl exec "${ingresspod%% *}" -- getcap -v /usr/local/nginx/sbin/nginx
/usr/local/nginx/sbin/nginx = cap_net_bind_service+ep

SELinux 已启用,但在 Linux 主机上处于宽容模式。

原来是因为在 Linux 主机上,dockerd 被 运行 与 --no-new-privileges 选项。