无法使用 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 中提到的目标主机工作。
我正在使用启用了容器和 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 中提到的目标主机工作。