docker - 我可以在 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。我不希望它会。(我预计错了。)
解决方案
此行为是在 20.3.0 中net.ipv4.ip_unprivileged_port_start
通过将网络命名空间内部的值更改为来添加的0
,有效地使所有端口都没有特权。由于容器通常运行单个应用程序,因此将应用程序限制为仅侦听特权端口(就像在多用户主机上想要的那样)几乎没有价值。
推荐阅读
- pandas - Pandas - 在数据透视表中删除级别,将索引保留为列名
- html - 标题文本右侧的垂直对齐图标
- node.js - 在 NodeJS 中使用 SequelizeORM 重命名 PostgreSQL 中的现有表
- javascript - 使用递归对 1 和 num 之间的所有数字求和
- multithreading - 工作线程如何结束应用程序?
- multithreading - kernel Stills 安排代码在独立的内核上运行
- ruby-on-rails - Rails 路线 - 使用相同的路线添加更多范围
- angular - 'zxing-scanner' 不是已知元素: 1. 如果 'zxing-scanner' 是 Angular 组件,则验证它是否是该模块的一部分
- javascript - 根据视口大小下载js库
- python - 如何在 Python 中更改 .env 文件路径?