docker - 为什么我可以绑定到 80 端口
问题描述
我用非 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
.
这个限制(绑定 < 1024 个端口的 root 访问权限)不再有效吗?它是由较新版本的 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
解决方案
似乎从 Docker 20.03.0 开始,即使放弃所有功能,您现在也可以绑定到任何端口。
在此处查看答案在我的 Docker 容器中,为什么我仍然可以在没有 NET_BIND_SERVICE 功能的情况下绑定端口 1?
推荐阅读
- javascript - 如何使用javascript转换小时:分钟
- javascript - 滑动活动中的按钮
- javascript - 如何使复选框成为带有确认消息的按钮?
- node.js - 如何从 VS Code 终端执行两个命令?
- sql - 如何将 3.5k 整数插入 Oracle DB 中的数组
- linux - strace 将父 pid 关联到子 pid
- odoo - 在群发邮件中添加附件
- javascript - 在 Jupyter Notebook 中将自定义 Javascript 回调注入我的 plot.ly 代码
- ios - 代码签名“libswiftAVFoundation.dylib”失败
- kotlin - 如何使用带有通用接口和其他参数的构造函数在 Kotlin 中创建对象