【问题标题】:How to expose an asp.net core docker container to a public url?如何将 asp.net 核心 docker 容器公开给公共 url?
【发布时间】:2020-10-10 20:04:55
【问题描述】:

如果我有一个公共 url,例如 https://dogsandcats.com,并且我希望能够从已部署的 docker 容器连接到该服务器,我该怎么做?

目前,我的 .Net Core 项目有以下 Dockerfile:

FROM microsoft/dotnet:sdk AS build-env
WORKDIR /app

# Copy csproj and restore as distinct layers
COPY *.csproj ./
RUN dotnet restore

# Copy everything else and build
COPY . ./
RUN dotnet publish -c Release -o out

# Build runtime image
FROM microsoft/dotnet:aspnetcore-runtime
WORKDIR /app
COPY --from=build-env /app/out .

EXPOSE 8080
ENTRYPOINT ["dotnet", "MedicineInventoryManagement.dll"]

我正在公开端口 8080,当我在本地环境中访问 localhost:8080 时,我可以看到我的网络服务器正在分发应用程序。我已经在https://dogsandcats.com 上映射了端口 8080,但它不像在我的本地计算机上那样运行。

我必须对Program.cs 中的以下代码块做些什么吗?

public class Program
    {
        public static void Main(string[] args)
        {
            CreateWebHostBuilder(args).Build().Run();
        }

        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseStartup<Startup>();
    }
}

还是问题出在其他地方?

【问题讨论】:

  • 默认情况下,dotnet 核心应用程序在端口 5000 上运行,但我没有看到您使用 UseUrls 来改变它。当你从外面尝试时,你看到了什么?如果我理解正确,您正在使用公共 url 在服务器上部署您的容器,当您尝试从外部连接时它不起作用?
  • 当我使用这个容器时:aspnetcore-runtime,它默认运行在8000端口。当我尝试访问公共网站时,我得到一个 503 Forbidden No server running 来处理请求错误。我认为没有 docker asp.net 核心网站默认会在 5000 端口上运行,但是有了这个容器就不同了。

标签: c# docker asp.net-core


【解决方案1】:

microsoft/dotnet:aspnetcore-runtime 映像将 ASPNETCORE_URLS 环境变量设置为 http://+:80,这意味着如果您没有在应用程序中明确设置 URL,例如通过 Program.cs 中的 app.UseUrl,那么您的应用程序将监听容器内的 80 端口。

https://hub.docker.com/r/microsoft/aspnetcore/

【讨论】:

    【解决方案2】:

    我会使用自下而上的方法来调试此类问题。

    1. docker ps 检查您的容器向主机公开了哪些端口以及它绑定到哪些端口?在端口列下查看。您还可以使用以下命令并提供您的容器名称:

    docker inspect --format='{{range $p, $conf := .NetworkSettings.Ports}} {{$p}} -&gt; {{(index $conf 0).HostPort}} {{end}}' $INSTANCE_ID

    如果端口按预期公开,则需要在主机上检查一些事项。现在,根据您的环境设置方式,步骤可能会有所不同,但您会明白我的意思。

    1. 首先查看防火墙规则。例如,如果您在 Ubuntu 上并启用了 UFW,请检查规则是否配置为允许访问该端口。如果您在家庭/办公室路由器后面,您可能希望打开端口以让公共流量进入该端口。如果您正在运行像 Apache/Nginx 这样的服务器,我会检查我的虚拟主机/服务器块是否配置正确。

    2. 如果您发现您的端口按预期打开,请尝试使用您网络的公共 ip 访问它。如果我们无法使用机器的公共 IP 访问 DNS 记录,那么查看 DNS 记录是没有意义的。毕竟,这就是 DNS 所指向的。如果您无法访问,我会返回第 2 步。

    如果步骤#3 一切都清楚,那么我会查看 DNS 记录并尝试找出问题。

    为了理解这个过程,这里是一个非常高级的概述。尝试自下而上的方法,这样您就可以准确指出您遇到的问题。

    [DNS] => [您网络的公共 IP] => [硬件防火墙,如路由器等] => [Nginx/Apache Web 服务器等,如果有的话] => [机器的防火墙,如操作系统或第三方] = > Docker 主机端口 => 容器中的 Dotnet Core 端口。

    如果您只是想快速测试一些东西以用于开发目的,您也可以使用ngrok 之类的东西。通过为您设置代理(特别是当您位于您无法控制的严格防火墙后面时),这消除了第 2 步和第 3 步的痛苦。我与 ngrok 没有任何关系。还有其他一些替代方案。

    【讨论】:

      猜你喜欢
      • 2018-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-15
      • 2015-05-06
      相关资源
      最近更新 更多