无法使用 Windows Server 2019 上的 docker-compose.yml 文件环回主机 IP

Unable to loopback to host ip using docker-compose.yml file on Windows Sever 2019

我正在使用启用了容器和 Hyper-V 功能的 Windows Server 2019。另外,我确保机器上安装了 Windows 对 Linux 容器的支持。 我需要使用 docker-compose.yml 文件来启动 docker 容器(Web API),但我希望从容器公开的端口只能在主机上访问。

下面是我使用环回 127.0.0.1 的示例 docker-compose.yml。

webapi:
    image: webapi
    build:
      context: .
      dockerfile: webapi/Dockerfile
    container_name: webapi
    restart: always
    environment:
      - ASPNETCORE_ENVIRONMENT=Development
      - ASPNETCORE_URLS=https://+:443
    ports:
      # Allow access to web APIs only on this local machine and on secure port.
      - "127.0.0.1:5443:443"

此解决方案在安装了 Docker 桌面的 Windows 10 机器上运行良好,但在安装了 Windows Server 2019 的 Windows Server 2019 上不起作用=45=] 安装EE。我收到以下错误,其中 webapi 是 linux 图像:

错误:对于 webapi 无法启动服务 webapi:无法在网络上创建端点 webapi containers_default:Windows 在 NAT 设置中不支持主机 IP 地址 错误:启动项目时遇到错误。

我的 Windows Server 2019 docker 配置如下所示:

PS C:\Users\xyz> docker version
Client: Mirantis Container Runtime
 Version:           20.10.5
 API version:       1.41
 Go version:        go1.13.15
 Git commit:        105e9a6
 Built:             05/17/2021 16:36:02
 OS/Arch:           windows/amd64
 Context:           default
 Experimental:      true

Server: Mirantis Container Runtime
 Engine:
  Version:          20.10.5
  API version:      1.41 (minimum version 1.24)
  Go version:       go1.13.15
  Git commit:       1a7d997053
  Built:            05/17/2021 16:34:40
  OS/Arch:          windows/amd64
  Experimental:     true

PS C:\Users\xyz> docker info
Client:
 Context:    default
 Debug Mode: false
 Plugins:
  app: Docker Application (Docker Inc., v0.8.0)
  cluster: Manage Mirantis Container Cloud clusters (Mirantis Inc., v1.9.0)
  registry: Manage Docker registries (Docker Inc., 0.1.0)

Server:
 Containers: 0
  Running: 0
  Paused: 0
  Stopped: 0
 Images: 5
 Server Version: 20.10.5
 Storage Driver: windowsfilter (windows) lcow (linux)
  Windows:
  LCOW:
 Logging Driver: json-file
 Plugins:
  Volume: local
  Network: ics internal l2bridge l2tunnel nat null overlay private transparent
  Log: awslogs etwlogs fluentd gcplogs gelf json-file local logentries splunk syslog
 Swarm: inactive
 Default Isolation: process
 Kernel Version: 10.0 17763 (17763.1.amd64fre.rs5_release.180914-1434)
 Operating System: Windows Server 2019 Datacenter Version 1809 (OS Build 17763.1999)
 OSType: windows
 Architecture: x86_64
 CPUs: 4
 Total Memory: 16GiB

如有任何帮助,我们将不胜感激。

花了相当多的时间后,我没有找到解决 Windows does not support host IP addresses in NAT settings 错误的方法,也没有使用任何其他网络/驱动程序(网桥、主机等)。但是,我找到了一种解决方法,通过使用 appsettings.json 中的“AllowedHosts”参数配置 Web 应用程序(容器)的 Kestrel Web 服务器,使端口仅在本地计算机上公开。我将参数值设置如下:

    {
      // allow the web apis to be accessible only on host machine as a security measure.
      // allow access only if the host in the URL matches the values mentioned in the list.
      "AllowedHosts": "localhost;127.0.0.1",
      "Serilog": {
        "Using": [],
        "MinimumLevel": {
          "Default": "Debug",
          "Override": {
            "Microsoft": "Warning",
            "System": "Warning"
          }
        },
    ...
    }

所有这一切只是检查 URL 中的主机是本地主机还是类似于环回的 127.0.0.1。

您也可以通过在 yml 文件的环境变量中传递“AllowedHosts”参数来覆盖此参数,如下所示:

webapi:
    image: webapi
    build:
      context: .
      dockerfile: webapi/Dockerfile
    container_name: webapi
    restart: always
    environment:
      - ASPNETCORE_ENVIRONMENT=Development
      - ASPNETCORE_URLS=https://+:443
      - AllowedHosts=*
    ports:
      # Allow access to web APIs only on this local machine and on secure port.
      - "5443:443"

请注意,此处不使用 AllowedHosts 来安全列出 IP 以接受来自的连接,因为它基于 URL 中提到的目标主机工作。