我可以在 docker 容器中以非 root 用户身份绑定到端口 80。为什么?这是怎么回事?

Ken*_*lor 3 docker

简洁版本:

我可以在以非 root 用户身份运行时绑定到 docker 容器内的端口 80。请解释。

长版:

我对 docker 很陌生,但在其他方面有很多经验。除了这种行为之外,一切对我来说都是有意义的。

我尝试过 Google centos 基础镜像和最新的 docker ubuntu 镜像。

我使用以下 Dockerfile 在这些基础上构建了一个 docker 映像:

FROM marketplace.gcr.io/google/centos7

# or for ubuntu
# FROM ubuntu
# RUN apt-get update -y && apt-get install -y python

RUN groupadd -g 1000 container && useradd -r -u 1000 -g container container
USER container
Run Code Online (Sandbox Code Playgroud)

伟大的。然后我使用 构建并运行它,现在我位于返回“container”的docker run --rm -it <img_name>容器中。whoami我没有root权限。touch /root/foo失败并拒绝访问。

嗯不错。非root用户,无需root权限运行。我不能sudo。我不能su root。正如我所期望的那样。

然后我运行:

python -m SimpleHTTPServer 80它很高兴地绑定到端口 80。我可以curl localhost在容器内运行并得到响应。

这是怎么回事?我缺少什么。

谢谢你的帮助。

如果有必要的话,我正在运行 Docker for Mac。我不指望会这样。(我的预期是错误的。)

BMi*_*tch 5

此行为是在 20.3.0 中添加的net.ipv4.ip_unprivileged_port_start,通过将网络命名空间内部的值更改为0,有效地使所有端口都没有特权。由于容器通常运行单个应用程序,因此限制该应用程序仅侦听特权端口(就像您在多用户主机上希望的那样)没有什么价值。