Docker容器已运行但localhost无法访问网站(404错误)
ASP.NET网站Docker容器运行返回404问题排查
可能的原因及排查步骤
1. 端口映射未配置
你的Dockerfile暴露了80端口,但启动容器时必须显式配置端口映射,否则宿主机无法访问容器内的服务。执行启动命令时需添加端口映射参数:
docker run -p 80:80 <你的镜像名称/ID>
2. 应用未正常启动(含数据库连接问题)
本地PostgreSQL的localhost在容器内指向容器自身,无法访问宿主机的数据库,这可能导致应用启动失败或服务异常,进而返回404。
- 查看容器日志:执行
docker logs <容器ID/名称>,检查应用启动时是否有数据库连接报错或其他启动异常信息。 - 修正数据库连接地址:将配置文件中的数据库地址改为宿主机的局域网IP,或使用
host.docker.internal(Windows/macOS/Linux均支持),同时确保PostgreSQL允许外部连接:- 修改
pg_hba.conf,添加允许容器网段的访问规则(如host all all 172.17.0.0/16 md5) - 修改
postgresql.conf,将listen_addresses设为*
- 修改
3. 应用路由或静态文件问题
本地运行正常不代表容器内Release模式下配置正确:
- 检查容器内文件完整性:进入容器查看发布文件是否齐全:
确认静态文件(React打包后的文件)、dll文件是否存在,且dll名称与ENTRYPOINT中的docker exec -it <容器ID> bash ls /appReactJS App.dll一致(项目名带空格可能引发命名问题,建议改为无空格的项目名)。 - 测试容器内部访问:在容器内执行
curl http://localhost或curl http://localhost/api/xxx,若内部访问也返回404,说明是应用路由配置或启动逻辑问题,需检查Release模式下的路由注册、静态文件中间件配置。
4. Dockerfile潜在问题
项目名包含空格可能导致发布或启动时出现隐性问题,建议将项目名改为ReactJSApp这类无空格名称,同时更新Dockerfile中的对应路径和命令:
FROM mcr.microsoft.com/dotnet/aspnet:7.0 AS base WORKDIR /app EXPOSE 80 EXPOSE 443 FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build WORKDIR /src COPY ["ReactJSApp/ReactJSApp.csproj", "ReactJSApp/"] RUN dotnet restore "ReactJSApp/ReactJSApp.csproj" COPY . . WORKDIR "/src/ReactJSApp" RUN dotnet build "ReactJSApp.csproj" -c Release -o /app/build FROM build AS publish RUN dotnet publish "ReactJSApp.csproj" -c Release -o /app/publish /p:UseAppHost=false FROM base AS final WORKDIR /app COPY --from=publish /app/publish . ENTRYPOINT ["dotnet", "ReactJSApp.dll"]
内容的提问来源于stack exchange,提问作者trying
相关产品推荐
相关产品推荐

