Docker 上的 ASP.NET 未向浏览器提供 Web 应用程序

2023-12-28

当 Web 应用程序容器化在 Docker 中时,我无法将 ASP.NET Web 应用程序提供给我的浏览器。

我正在运行 Mac,并使用 Visual Studio Code 创建 ASP.NET Web 应用程序。这是一个简单的、开箱即用的演示,基于yo aspnet“空的应用程序。”当“本机”运行(在 Docker 之外)时,该应用程序提供“Hello World!”到http://本地主机:5000 http://localhost:5000正好。换句话说,运行dnx web启动 Web 服务器 (Kestrel) 并产生:

Hosting environment: Production 
Now listening on: http://localhost:5000
Application started. Press Ctrl+C to shut down.

这很好。现在进入 Docker。我似乎已经成功构建了一个包含 Web 应用程序的 Docker 映像,当我在 Docker 中运行容器时,我从 Kestrel 获得了相同的输出。也很好,但是,我无法再加载“Hello World!”我的浏览器中的页面位于http://本地主机:5000 http://localhost:5000。相反,我得到一个ERR_CONNECTION_REFUSED。这是相当明显的,因为由于 Docker“间接”,不再有任何东西直接服务于端口 5000。换句话说,我认为转发配置不正确,或者我认为我误解了寻址。

我相信这个过程中涉及到端口转发。在我的 Dockerfile 中,我使用EXPOSE 5000我认为这可以让我使用如下运行命令将本地使用的端口 5000 映射到 Docker 容器的端口 5000:

docker run -i -t -p 5000:5000 container_name

但情况并非如此http://本地主机:5000 http://localhost:5000 (ERR_CONNECTION_REFUSED)。所以我想到 Docker 几乎肯定不会localhost。我注意到当 Docker 加载时,它会说:

docker is configured to use the default machine with IP 192.168.99.100

所以,我想我会尝试http://192.168.99.100:5000 http://192.168.99.100:5000,但又(令人困惑?)ERR_CONNECTION_REFUSED。接下来,我读到一篇有趣的文章here https://stackoverflow.com/questions/19897743/exposing-a-port-on-a-live-docker-container我能够从建议的命令中确定

docker inspect container_name | grep IPAddress

容器已分配"IPAddress": "172.17.0.2"

所以,我想我会尝试http://172.17.0.2:5000 http://172.17.0.2:5000。现在我们可能真的有所进展,因为而不是ERR_CONNECTION_REFUSED,我反而得到一个旋转的沙漏并导致超时。但仍然没有“Hello World!”

我可能会缺少什么?


事实证明,Web 应用程序is可以在虚拟机的IP地址上使用192.168.99.100正如怀疑的那样。172.17.0.2显然是某种转移注意力的事情。

真正的问题似乎是容器的默认“内部”IP 是0.0.0.0

遵循了优秀的建议这个帖子 http://dotnetliberty.com/index.php/2015/11/26/asp-net-5-on-aws-ec2-container-service-in-10-steps/,我编辑了 Dockerfile 并指定了以下内容:

ENTRYPOINT ["dnx", "web", "--server.urls", "http://0.0.0.0:5000"]

因为...

这将允许我们的 Web 应用程序处理来自以下位置的请求: Docker 提供的端口转发默认为 0.0.0.0

端口映射对于将主机端口链接到容器端口至关重要,但是EXPOSE命令显然是多余的。现在,当我跑步时

docker run -i -t -p 80:5000 container_name

我可以简单地浏览到http://192.168.99.100 http://192.168.99.100(端口 80 是隐式的)

还有中提琴!这是我的“你好世界!”

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Docker 上的 ASP.NET 未向浏览器提供 Web 应用程序 的相关文章

  • Microsoft.Extensions.Caching.Redis 选择与 db0 不同的数据库

    一个关于了解使用哪个redis数据库以及如何配置它的问题 我有一个默认值ASP NET Core Web 应用程序和默认配置的本地redis服务器 含15个数据库 通过包管理控制台我已经安装了 Install Package Microso
  • 无法使用 docker build 运行 gradle 包装器

    我有这个小构建 FROM eclipse temurin 17 jdk as build java COPY java project root project WORKDIR root project RUN chmod x gradle
  • 当用户告诉浏览器“刷新”时,是否应该填写 HTTP_REFERER?

    我正在尝试使用引用标头检查作为深度防御 即多种安全技术之一 但请注意仅依赖于任何一种技术 有时 MSIE 似乎不包含刷新时的引荐来源网址 这是预期的行为吗 无论如何 我是否可以检测刷新 以便我知道缺少引荐来源网址是可以的 是的 我知道引荐来
  • 当会话令牌无效时,我应该使用什么状态代码?

    创建 Web 服务 RESTful 时 当会话令牌无效时我应该使用什么状态代码 目前我公司的人给我发了一个404 未找到 但我认为这是不正确的 因为资源存在 也许我应该使用 401 Unauthorized 你怎么认为 您建议我在这种情况下
  • 仅使用containerd(不使用Docker)修剪容器镜像

    如果我刚刚containerd安装在 Linux 系统上 即 Docker 是not安装 如何删除未使用的容器映像以节省磁盘空间 Docker 就是这么方便docker system prune https docs docker com
  • 锚标记 href 中的 eval

    我想要实现的目标是在锚标记的 href 中使用 Eval 作为参数 锚点嵌套在转发器内 为什么我不能使用后面的代码来实现这一点 我尝试了一些事情但没有运气 a href http MyWebsite ActiveUsers ID Inser
  • 如何终止会话或会话 ID (ASP.NET/C#)

    当用户单击注销按钮时 如何销毁会话 会话 名称 我正在 MSDN 上查看 ASP NET API Reference 它似乎没有太多信息 看来还是比较有限的 但我找不到 ASP NET 类等的任何其他页面 我努力了 Session Aban
  • 从备用位置获取实体框架连接字符串?

    如何从自定义配置文件而不是 web config 检索 Entity Framework 4 连接字符串 编辑 删除默认构造函数生成的代码并在分部类中重新创建它以使用拉入的连接字符串是否合理 我真的很想避免使用包括连接字符串在内的重载方法更
  • 家庭自动化图书馆[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我是一名 C 开发人员 希望将家庭自动化作为一种 爱好 我做了一些研究 但想知道是否有人知道支持 In
  • 控件更改时 ObjectDataSource 创建两次

    我将 ObjectDataSource 与 GridView 一起使用 并在代码隐藏中使用 OnObjectCreated 处理程序 如果我以编程方式更改 GridView 上的子控件值 则整个控件会在同一请求中再次进行数据绑定 如 OnO
  • 如何在“Docker for Windows”中启用docker远程API

    I have 适用于 Windows 的 Docker 桌面1 12 1 stable 内部版本 7135 安装在我的 Windows 10 计算机上 我想使用以下方式访问 docker远程API https docs docker com
  • docker 中的 php Curl 冲突 CURLOPT_FILE 和 CURLOPT_RETURNTRANSFER

    当我使用curl时CURLOPT FILE and CURLOPT RETURNTRANSFER选项 文件为空 没有任何curl错误 fp fopen saveTo w ch curl init fileUrl curl setopt ch
  • 为什么 websocket 需要使用 HTTP 进行打开握手?为什么不能成为一个独立的协议呢?

    Websocket 的设计方式是 通过使其握手成为有效的 HTTP 升级请求 其服务器可以与 HTTP 服务器共享端口 我对这个设计理念存有疑问 无论如何 WebSocket 协议都是一个独立的基于 TCP 的协议 为什么我们需要这个 HT
  • Asp.net Identity 注销其他用户

    我正在使用 Asp net Identity 来验证用户身份 并尝试从管理端锁定任何用户 但是当我锁定任何在线用户时 它并没有注销 我读过很多关于我的问题的评论 但它们都不起作用 我尝试使用 UserManager UpdateSecuri
  • Asp.net MVC 路由 - 防止通过约束路由到 XML 文件

    我正在尝试找到一种方法来阻止用户访问特定的 xml 文件 我尝试过做 routes MapRoute SiteMap SiteMap siteMap xml new new isLocal new LocalHostRouteConstra
  • HTTPWebResponse 响应字符串被截断

    应用程序正在与 REST 服务通信 Fiddler 显示作为 Apps 响应传入的完整良好 XML 响应 该应用程序位于法属波利尼西亚 在新西兰也有一个相同的副本 因此主要嫌疑人似乎在编码 但我们已经检查过 但空手而归 查看流读取器的输出字
  • 页面上使用 HTML Editor Extender 进行回发会导致 IE11 中出现 JavaScript 错误

    我已将 HTML 编辑器扩展程序添加到我正在处理的页面中 现在每当我在页面上发回帖子时 都会收到以下 Javascript 错误 JavaScript 运行时错误 参数无效 之后什么也没有发生 这在 IE10 或更低版本以及我所知道的所有其
  • 如何在整个 ASP .NET MVC 应用程序中需要授权

    我创建的应用程序中 除了启用登录的操作之外的每个操作都应该超出未登录用户的限制 我应该添加 Authorize 每个班级标题前的注释 像这儿 namespace WebApplication2 Controllers Authorize p
  • 服务器不支持 C# 中的安全连接

    我在下面的代码中收到错误 服务器不支持安全连接 SmtpClient smtp new SmtpClient MailMessage mail new MailMessage mail From new MailAddress gmail
  • Docker COPY 命令可以链接起来吗

    是否可以将 COPY 命令链接在一起 就像使用 RUN 命令可以完成的操作一样 链接运行命令的示例 RUN echo root user 2017 chpasswd groupadd g 1000 user useradd u 1000 m

随机推荐