【问题标题】:Unable to access Docker application from browser无法从浏览器访问 Docker 应用程序
【发布时间】:2018-11-12 22:58:27
【问题描述】:

我有一个 .NET Core 2.1 API,当它在 Windows 中通过 Visual Studio 运行时,它会从浏览器接收 HTTP GET 并成功地从 MySQL 数据库返回数据。

我一直在尝试将 API 添加到 Docker 容器(在 Ubuntu 中) - 这可以构建,但我无法从浏览器访问 API:

我的尝试

  • 检查可用端口。以下是相关输出:

  • 使用其他浏览器连接:在 Chromium 中,它显示“无法访问此站点:localhost 意外关闭了连接。”
  • 在浏览器中测试未使用的端口以查看这是否返回不同的消息 - 对于 Firefox,未使用的端口返回“无法连接”而不是“安全连接失败”,并且在 Chromium 中它们返回“本地主机拒绝连接”。而不是“localhost 意外关闭了连接。”
  • 在 Firefox 中,将“security.tls.insecure_fallback_hosts”配置为“localhost”。
  • 在 docker-compose.yml 中仔细检查端口是否正确映射 - 在相关容器的“端口”下,44329 映射到 44329。
  • 在 API 启动时运行数据库查询并记录结果:这是成功的。我运行docker-compose up,API 启动,连接到数据库容器,并将 SQL 查询的结果记录到文本文件中。所以问题不太可能与数据库有关。
  • 记录 GET 请求:在 Windows 内部,GET 请求已成功记录,但在 Ubuntu Docker 容器中却没有。

这可能是相关的:在 Windows 中,只有从 Visual Studio 启动 API 才能正常工作。如果你执行dotnet webapi.dll,你会得到这个输出

...\netcoreapp2.1>dotnet webapi.dll
...
Now listening on: http://localhost:5000
Now listening on: https://localhost:5001
Application started. Press Ctrl+C to shut down.

所以这里它不在 44329 上运行;相反,它可以通过浏览器中的 5001 访问,您会在其中收到这条消息,它一点也不冷: 单击“高级”可让您继续使用 API。

  • 所以我也尝试在 Ubuntu 中通过 5001 进行连接,但没有成功。

这是 'docker-compose up' 的输出:

matt@Matt-Ubuntu:~/docker2$ docker-compose up
Starting docker2_mysql_1 ... done
Starting docker2_dbmodelmapper_1 ... done
Attaching to docker2_mysql_1, docker2_dbmodelmapper_1
... (mysql stuff) ...
dbmodelmapper_1  | Hosting environment: Production
dbmodelmapper_1  | Content root path: /app
dbmodelmapper_1  | Now listening on: http://[::]:80
dbmodelmapper_1  | Application started. Press Ctrl+C to shut down.
  • 看到端口 80,我尝试连接到该端口,但没有成功。

  • docker ps所示的相关容器为:

我在这里看到什么样的问题?

【问题讨论】:

  • docker ps的输出是什么
  • 已将其添加到问题的末尾
  • 会不会是防火墙问题?
  • 似乎不是 - ufw 被禁用,iptables 被 Docker 配置为允许这些端口。
  • 当您尝试连接到端口 80 时,您是否发布了端口?上面的输出没有显示端口 80。

标签: docker asp.net-core .net-core docker-compose ubuntu-16.04


【解决方案1】:

正如 cmets 中的多人指出的那样(感谢 sp0gg、Martin Ullrich 和 Daniel Lerps),API 错误地监听了端口 80。

解决方案是在 docker-compose.yml 中为 API 容器映射端口 5000 到 44329,同时修改 Dockerfile 以在启动 ASP.NET API 时将端口作为参数传递给 dotnet:

ENTRYPOINT ["dotnet", "webapi.dll", "--urls", "http://*:5000;http://*:5001"]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多