我无法访问Linux docker中托管的ASP.Net Core网站

时间:2020-08-25 20:11:22

标签: docker nginx

我有一个示例helloworld asp.net核心MVC应用程序托管在linux docker中。泊坞窗图片基于

    FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base
    WORKDIR /app
    EXPOSE 80
    EXPOSE 443

构建映像并在容器中运行映像后,我可以看到容器正在运行,并在Docker主机上监听8080端口。

enter image description here

但是我无法使用URL访问网站

http://192.168.0.100:8080

作为调试的一部分,我使用了来自docker主机(运行docker的Linux机器)上的curl来分析响应标头

enter image description here

从docker容器中得到了相同的响应(172.17.0.2是docker的IP

enter image description here

我想知道是否有防火墙阻止对8080端口的请求,以检查我是否拥有UFW的状态。

enter image description here

有人可以告诉我我想念的东西吗

更新1 :我将网站部署在docker外部,它工作正常,但由于在Kestrel中托管,因此无法在Linux外部访问。我安装了Nginx并配置为现在重新路由请求和网站,因为在Linux盒子之外也可以访问。

现在是因为应用程序本应托管在docker容器中的kestrel中,这也是为什么托管在该容器中时我无法访问该站点的原因。

2 个答案:

答案 0 :(得分:1)

我认为您只是在容器中8080​​上使用的Kestrel(或Nginx)与主机的裸露端口(根据上述配置为80)之间存在不匹配。现在,我希望在Docker主机的两个端口80/8080上都获得一个404,因为8080没有公开,并且80没有映射任何内容。

在配置容器时,您需要添加一个标志,例如--publish 80:8080,它将容器中的TCP端口8080映射到Docker主机上的端口80。

查看the docs on published ports了解更多详细信息。

答案 1 :(得分:1)

我谨记,如果您尝试通过类似http://192.168.0.100:8080的网址访问您的应用, 您应该在 host 网络中运行容器(docker run ... --net host ...),如果可以的话。默认情况下,所有应用程序都在具有网状网络的容器中运行。实际上,您应该尝试通过容器ip:172.17.0.2或实际的容器ip访问(以查看有关网络运行shell docker 的详细信息),并通过172.17.0.2:8080访问应用程序)。在网桥网络模式下,您无法在计算机ip上访问8080,如果您使用的是Linux,则应该通过iptables调整接口之间的路由,或者在从Windows运行的防火墙中正确设置Windows防火墙。第二种方法是在Web服务器上配置代理,以传递来自本地计算机ip + 8080端口(在Docker容器ip +端口上)的请求。但是,如果为代理服务器绑定8080,则不能将其用于容器中的端口映射。