Docker 不关心用户权限。为什么?

Docker does not care about user permissions. Why?

我有一个 docker 文件 userPermissionDenied.df,这是它的内容:

FROM busybox:1.29
USER 1000:1000
ENTRYPOINT ["nc"]
CMD ["-l", "-p", "80", "0.0.0.0"]

我运行以下命令:

> docker image build -t fooimg -f userPermissionDenied.df .
> docker container run fooimg

现在我希望得到以下输出:

> nc: bind: Permission denied

但我根本没有得到任何输出:

容器刚刚挂起。为什么?

我正在通过 Docker in Action by Jeff Nickoloff 学习 Docker,这就是我从中获得用例的地方。

鉴于您是 运行 作为 non-root 用户的 nc 命令(由于 Dockerfile 中的 USER 1000:1000 指令),您可能当 nc 尝试绑定端口 80 时,预计会看到某种“权限被拒绝”错误。

在 Docker 的早期版本中,这正是会发生的情况,但是 a few years ago Docker was modified so that containers run with net.ipv4.ip_unprivileged_port_start=0,这意味着不再有任何“特权端口”:任何 UID 都可以绑定任何端口。

您可以在容器内通过 运行 sysctl 查看此设置:

$ docker run -it --rm -u 1000:1000 alpine sysctl -a |grep net.ipv4.ip_unprivileged_port_start
net.ipv4.ip_unprivileged_port_start = 0

the container just hangs. Why?

容器没有“挂”;它成功 运行 nc -l -p 80,正在等待连接到端口 80 上的容器。如果您要使用 curl 或其他工具连接到该容器中的端口 80,它会显示通过连接发送的任何数据,然后容器会在连接关闭时退出。