繁体   English   中英

如何将 asp.net core docker 容器暴露给公共 url?

[英]How to expose an asp.net core docker container to a public url?

如果我有一个公共 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>();
    }
}

还是问题出在其他地方?

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

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

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

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

docker inspect --format='{{range $p, $conf := .NetworkSettings.Ports}} {{$p}} -> {{(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 核心端口。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM