首页 > 解决方案 > 为什么我可以绑定到 80 端口

问题描述

我用非 root 用户创建了一个图像,并且一直认为你不能绑定到端口 < 1024(我在不同的指南和 StackOverflow 上的很多问题中看到了它)。但是为了测试,我创建了简单的ASP.NET Core Web API(从模板)并生成DockerfileVS Code(甚至VS Code认为相同,如果你Dockerfile为 5000 端口生成它会创建非 root 用户,但如果你选择 80 端口,那么它会使用 root 用户创建图像)。

Dockerfile:

FROM mcr.microsoft.com/dotnet/aspnet:5.0-focal AS base
WORKDIR /app
EXPOSE 80

ENV ASPNETCORE_URLS=http://+:80

# Creates a non-root user with an explicit UID and adds permission to access the /app folder
# For more info, please refer to https://aka.ms/vscode-docker-dotnet-configure-containers
RUN addgroup --gid 8765 appgroup
RUN adduser -u 5678 --gid 8765 --disabled-password --gecos "" appuser && chown -R appuser:appgroup /app
USER appuser:appgroup

FROM mcr.microsoft.com/dotnet/sdk:5.0-focal AS build
WORKDIR /src
COPY ["webapi.csproj", "./"]
RUN dotnet restore "webapi.csproj"
COPY . .
WORKDIR "/src/."
RUN dotnet build "webapi.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "webapi.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "webapi.dll"]

然后构建并运行它:

docker build . -t test
docker run --rm -it -p 5000:80 test

它工作得很好,然后我检查top命令的结果,它输出dotnet运行为appuser.

这个限制(绑定 < 1024 个端口的 root 访问权限)不再有效吗?它是由较新版本的 Docker 改变还是与 .NET 有关?

根据docker run文档,Docker添加了几个Linux功能(默认情况下)。其中之一是NET_BIND_SERVICE,它允许:

将套接字绑定到 Internet 域特权端口(端口号小于 1024)。

但是,如果我放弃所有功能--cap-drop=all,它仍然有效。

测试:

标签: docker.net-core

解决方案


似乎从 Docker 20.03.0 开始,即使放弃所有功能,您现在也可以绑定到任何端口。

在此处查看答案在我的 Docker 容器中,为什么我仍然可以在没有 NET_BIND_SERVICE 功能的情况下绑定端口 1?


推荐阅读