gpt4 book ai didi

docker - 为什么我可以绑定(bind)到80端口

转载 作者:行者123 更新时间:2023-12-04 17:17:24 30 4
gpt4 key购买 nike

我用非 root 用户创建了一个图像,并且一直认为你不能绑定(bind)到小于 1024 的端口(我在不同的指南和 StackOverflow 上看到了很多问题)。但是为了测试,我创建了简单的 ASP.NET Core Web API(来自模板)并通过 VS Code 生成了 Dockerfile(甚至 VS Code 认为相同,如果您为 5000 端口生成 Dockerfile,它会创建非根用户,但如果您选择 80 端口,则会创建具有根用户的图像。

docker 文件:

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 权限绑定(bind) < 1024 端口)不再有效了吗?它是由较新版本的 Docker 更改的还是与 .NET 相关?

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

Bind a socket to internet domain privileged ports (port numbers less than 1024).

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

测试于:

  • Docker 桌面 3.5.2(Mac 操作系统/Windows 10)
  • Linux Docker 20.10.7

最佳答案

似乎从 Docker 20.03.0 开始,您现在可以绑定(bind)到任何端口,即使在删除所有功能的同时也是如此。

在这里查看答案 In my Docker container, why can I still bind the port 1 without `NET_BIND_SERVICE` capability?

关于docker - 为什么我可以绑定(bind)到80端口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68389479/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com