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

问题描述

精简版:

我可以在以非 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

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

嗯不错。非 root 用户,在没有 root 权限的情况下运行。我不能sudo。我不能su root。正如我所料。

然后我运行:

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

这是怎么回事?我错过了什么。

谢谢你的帮助。

如果重要的话,我正在为 Mac 运行 Docker。我不希望它会。(我预计错了。)

标签: docker

解决方案


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


推荐阅读