【问题标题】:Docker: cannot get access to serverDocker:无法访问服务器
【发布时间】:2018-10-02 02:15:42
【问题描述】:

这里有一点背景故事。我使用微服务架构实现了几个 Web API。我正在尝试使我的微服务可以通过 HTTPS 访问。微服务是使用 .net 核心开发的,所以根据微软文档,为了强制 HTTPS,我需要配置 Kestrel。以下是我的做法。

.UseKestrel(options =>
            {
                options.Listen(IPAddress.Loopback, 5000);
                options.Listen(IPAddress.Loopback, 5001, listenOptions =>
                {
                    listenOptions.UseHttps("cert.pfx", "pwd");
                });
            }) 

为了简单起见,我自己使用 kestrel 并跳过反向代理。我肯定会将 Nginx 作为反向代理,但这是未来的工作。我在本地测试,它工作。然后,我将它部署到 Docker 上。这是 docker-compose.override 文件

version: '3.4'

services:
dataservice:
  environment:
    - ASPNETCORE_ENVIRONMENT=Development
    - ASPNETCORE_URLS=https://+:443;http://+:80
  ports:
    - "5000:80"
    - "5001:443"

在 dockerfile 中,暴露了 5000 和 5001 端口。我将项目构建到图像中,并使用docker run -it --rm -p 5000:80 --name *name* *imagename* 在 docker 上运行它。 Docker 显示 Now listening on: http://127.0.0.1:5000Now listening on: https://127.0.0.1:5001。现在的问题是,撇开 https 部分,API 甚至无法通过 http 访问。浏览器只显示This page isn’t working 127.0.0.1 didn’t send any data. ERR_EMPTY_RESPONSE。我从这里Docker: cannot open port from container to host 发现了一个类似的问题,不知何故这是关于服务器应该监听 0.0.0.0。虽然我不完全理解原因,但我将红隼配置更改为

options.Listen(IPAddress.Any, 5000);

再次构建并运行 docker 镜像,Docker 显示 Now listening on: http://0.0.0.0:5000,但仍然无法正常工作。我也试过用localhost替换IP,没用。我没有使用.UseHttpsRedirection(),https应该与问题无关。

我是否缺少任何配置或做错了什么?如果有人能提供一些启示,那将非常有帮助。提前谢谢你。

【问题讨论】:

    标签: docker .net-core microservices


    【解决方案1】:

    你应该在容器内的 80 和 443 上 listen,即 options.Listen(IPAddress.Any, 80);,因为这个 docker 声明

    ports: 
       - "5000:80"
    

    表示将本地端口 80(源代码中的端口)导出到外部端口 5000,而不是相反。

    【讨论】:

    • 谢谢,它有效。 HTTPS 功能也可以正常工作。
    猜你喜欢
    • 2021-04-10
    • 1970-01-01
    • 2017-04-26
    • 2018-12-10
    • 1970-01-01
    • 2018-04-20
    • 1970-01-01
    • 2020-09-19
    相关资源
    最近更新 更多