为什么我可以绑定到80端口

时间:2021-07-15 07:18:39

标签: docker .net-core

我用非 root 用户创建了一个映像,并且一直认为你不能绑定到端口 < 1024(我在不同的指南和 StackOverflow 上的很多问题中看到了它)。但是为了测试,我创建了简单的 ASP.NET Core Web API(来自模板)并通过 Dockerfile 生成了 VS 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 运行。

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

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

<块引用>

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

但如果我将所有功能删除 --cap-drop=all,它仍然有效。

测试:

  • Docker 桌面 3.5.2(Mac OS/Windows 10)
  • Linux Docker 20.10.7

0 个答案:

没有答案
相关问题