Windows 容器群发布端口且无法访问
Windows Container swarm publish port and not access
我使用 windows 容器并尝试创建 docker swarm ,我使用 hyper-v 创建了三个虚拟机,每个 OS 是 windows 服务器 2016.There 机器 ip 是:
windocker211 192.168.1.211
windocker212 192.168.1.212
windocker219 192.168.1.219
docker 群节点是:
PS C:\ConsoleZ> docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
4c0g0o0uognheugw4do1a1h7y windocker212 Ready Active
bbxot0c8zijq7xw4lm86svgwp * windocker219 Ready Active Leader
wftwpiqpqpbqfdvgenn787psj windocker211 Ready Active
我创建使用命令:
docker service create --name=demo5 -p 5005:5005 --replicas 6 192.168.1.245/cqgis/wintestcore:0.6
docker镜像是asp.net核心应用,Dockerfile是:
FROM 192.168.1.245/win/aspnetcore-runtime:1.1.2
COPY . /app
WORKDIR /app
ENV ASPNETCORE_URLS http://*:5005
EXPOSE 5005/tcp
ENTRYPOINT ["dotnet", "dotnetcore.dll"]
然后创建成功:
PS C:\ConsoleZ> docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
omhu7e0vo96s demo5 replicated 6/6 192.168.1.245/cqgis/wintestcore:0.6 *:5005->5005/tcp
PS C:\ConsoleZ> docker service ps demo5
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
8pihnak9a2ei demo5.1 192.168.1.245/cqgis/wintestcore:0.6 windocker212 Running Running 59 seconds ago
ut3f3b9giu4w demo5.2 192.168.1.245/cqgis/wintestcore:0.6 windocker219 Running Running 47 seconds ago
iy1xjevt67yl demo5.3 192.168.1.245/cqgis/wintestcore:0.6 windocker211 Running Running about a minute ago
q7f1gnbwslr3 demo5.4 192.168.1.245/cqgis/wintestcore:0.6 windocker212 Running Running about a minute ago
8zewaktcu32h demo5.5 192.168.1.245/cqgis/wintestcore:0.6 windocker219 Running Running about a minute ago
xq820kqwf3v9 demo5.6 192.168.1.245/cqgis/wintestcore:0.6 windocker211 Running Running 55 seconds ago
但我的问题是我无法通过
访问每个网站
http://192.168.1.219:5005/
http://192.168.1.219:5005/
http://192.168.1.219:5005/
当我使用命令时
docker run -it -p 5010:5005 192.168.1.245/cqgis/wintestcore:0.6
我可以使用http://192.168.1.219:5010/
得到正确的结果
我的docker信息是
PS C:\ConsoleZ> docker info
Containers: 4
Running: 3
Paused: 0
Stopped: 1
Images: 5
Server Version: 17.06.0-ce-rc1
Storage Driver: windowsfilter
Windows:
Logging Driver: json-file
Plugins:
Volume: local
Network: l2bridge l2tunnel nat null overlay transparent
Log: awslogs etwlogs fluentd json-file logentries splunk syslog
Swarm: active
NodeID: bbxot0c8zijq7xw4lm86svgwp
Is Manager: true
ClusterID: 32vsgwrbn6ihvpevly71gkgxk
Managers: 1
Nodes: 3
Orchestration:
Task History Retention Limit: 5
Raft:
Snapshot Interval: 10000
Number of Old Snapshots to Retain: 0
Heartbeat Tick: 1
Election Tick: 3
Dispatcher:
Heartbeat Period: 5 seconds
CA Configuration:
Expiry Duration: 3 months
Force Rotate: 0
Root Rotation In Progress: false
Node Address: 192.168.1.219
Manager Addresses:
192.168.1.219:2377
Default Isolation: process
Kernel Version: 10.0 14393 (14393.1198.amd64fre.rs1_release_sec.170427-1353)
Operating System: Windows Server 2016 Datacenter
OSType: windows
Architecture: x86_64
CPUs: 8
Total Memory: 2.89GiB
Name: windock219
ID: 7AOY:OT6V:BTJV:NCHA:3OF5:5WR5:K2YR:CFG3:VXLD:QTMD:GA3D:ZFJ2
Docker Root Dir: C:\ProgramData\docker
Debug Mode (client): false
Debug Mode (server): true
File Descriptors: -1
Goroutines: 297
System Time: 2017-06-04T19:58:20.7582294+08:00
EventsListeners: 2
Registry: https://index.docker.io/v1/
Experimental: true
Insecure Registries:
192.168.1.245
127.0.0.0/8
Live Restore Enabled: false
windows 容器的 Docker 和 Linux 容器的 Docker 之间的网络存在一些差异。 Windows 容器使用 HyperV 网络技术来提供 docker 使用的虚拟网络功能。有一些限制并不像您预期的那样有效,或者可能在标准 Docker 文档中找到。
- 首先,您无法通过以下方式访问容器内的 Web 端 运行
使用回溯地址 (127.0.0.1) 或主机地址 (192.168.1.xxx) 你必须调用它
总是来自远程机器。
- 我看到您在 Docker 文件中使用了 expose 命令。它不是
如此自我解释但暴露是暴露任何其他端口
网络然后是主机或入口网络。这不是问题,如果你
在非 swarm 配置中执行此操作,但它在 swarm 中不起作用。
我建议删除 Expose 命令。
- windows 网络存在一些未解决的问题。有时在容器重新启动后该端口仍在使用中。
例如,主机系统重启后。
[https://github.com/moby/moby/issues/21558][1]
使用此脚本,您可以删除所有虚拟网络设置:
Stop-Service docker
Get-ContainerNetwork | Remove-ContainerNetwork
Get-NetNat | Remove-NetNat
Get-VMSwitch | Remove-VMSwitch
Start-Service docker
我认为您需要以 "host" 模式发布端口 (docs.microsoft.com/en-us/virtualization/windowscontainers/… )。此外,它将是 运行ning 容器和主机之间的一对一端口映射,因此您将无法 运行 同一端口上的多个容器。路由网格尚未在 Windows 上运行。
由于 limitation of the WinNAT networking,您无法从同一台计算机访问容器的已发布端口。但是您可以使用外部请求到达所需的端口。
在您的示例中,从 而非 192.168.1.219
的计算机,使用 url http://192.168.1.219:5005/
访问将成功。如果请求来自这些机器之外,url 的 http://192.168.1.211:5005/
和 http://192.168.1.212:5005/
也会成功。
使用 'host' 模式会成功:但是,您没有获得 'routing mesh' 功能的优势,该功能允许从任何服务的节点访问服务 - 只能从那个一个节点。
我使用 windows 容器并尝试创建 docker swarm ,我使用 hyper-v 创建了三个虚拟机,每个 OS 是 windows 服务器 2016.There 机器 ip 是:
windocker211 192.168.1.211
windocker212 192.168.1.212
windocker219 192.168.1.219
docker 群节点是:
PS C:\ConsoleZ> docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
4c0g0o0uognheugw4do1a1h7y windocker212 Ready Active
bbxot0c8zijq7xw4lm86svgwp * windocker219 Ready Active Leader
wftwpiqpqpbqfdvgenn787psj windocker211 Ready Active
我创建使用命令:
docker service create --name=demo5 -p 5005:5005 --replicas 6 192.168.1.245/cqgis/wintestcore:0.6
docker镜像是asp.net核心应用,Dockerfile是:
FROM 192.168.1.245/win/aspnetcore-runtime:1.1.2
COPY . /app
WORKDIR /app
ENV ASPNETCORE_URLS http://*:5005
EXPOSE 5005/tcp
ENTRYPOINT ["dotnet", "dotnetcore.dll"]
然后创建成功:
PS C:\ConsoleZ> docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
omhu7e0vo96s demo5 replicated 6/6 192.168.1.245/cqgis/wintestcore:0.6 *:5005->5005/tcp
PS C:\ConsoleZ> docker service ps demo5
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
8pihnak9a2ei demo5.1 192.168.1.245/cqgis/wintestcore:0.6 windocker212 Running Running 59 seconds ago
ut3f3b9giu4w demo5.2 192.168.1.245/cqgis/wintestcore:0.6 windocker219 Running Running 47 seconds ago
iy1xjevt67yl demo5.3 192.168.1.245/cqgis/wintestcore:0.6 windocker211 Running Running about a minute ago
q7f1gnbwslr3 demo5.4 192.168.1.245/cqgis/wintestcore:0.6 windocker212 Running Running about a minute ago
8zewaktcu32h demo5.5 192.168.1.245/cqgis/wintestcore:0.6 windocker219 Running Running about a minute ago
xq820kqwf3v9 demo5.6 192.168.1.245/cqgis/wintestcore:0.6 windocker211 Running Running 55 seconds ago
但我的问题是我无法通过
访问每个网站http://192.168.1.219:5005/
http://192.168.1.219:5005/
http://192.168.1.219:5005/
当我使用命令时
docker run -it -p 5010:5005 192.168.1.245/cqgis/wintestcore:0.6
我可以使用http://192.168.1.219:5010/
得到正确的结果
我的docker信息是
PS C:\ConsoleZ> docker info
Containers: 4
Running: 3
Paused: 0
Stopped: 1
Images: 5
Server Version: 17.06.0-ce-rc1
Storage Driver: windowsfilter
Windows:
Logging Driver: json-file
Plugins:
Volume: local
Network: l2bridge l2tunnel nat null overlay transparent
Log: awslogs etwlogs fluentd json-file logentries splunk syslog
Swarm: active
NodeID: bbxot0c8zijq7xw4lm86svgwp
Is Manager: true
ClusterID: 32vsgwrbn6ihvpevly71gkgxk
Managers: 1
Nodes: 3
Orchestration:
Task History Retention Limit: 5
Raft:
Snapshot Interval: 10000
Number of Old Snapshots to Retain: 0
Heartbeat Tick: 1
Election Tick: 3
Dispatcher:
Heartbeat Period: 5 seconds
CA Configuration:
Expiry Duration: 3 months
Force Rotate: 0
Root Rotation In Progress: false
Node Address: 192.168.1.219
Manager Addresses:
192.168.1.219:2377
Default Isolation: process
Kernel Version: 10.0 14393 (14393.1198.amd64fre.rs1_release_sec.170427-1353)
Operating System: Windows Server 2016 Datacenter
OSType: windows
Architecture: x86_64
CPUs: 8
Total Memory: 2.89GiB
Name: windock219
ID: 7AOY:OT6V:BTJV:NCHA:3OF5:5WR5:K2YR:CFG3:VXLD:QTMD:GA3D:ZFJ2
Docker Root Dir: C:\ProgramData\docker
Debug Mode (client): false
Debug Mode (server): true
File Descriptors: -1
Goroutines: 297
System Time: 2017-06-04T19:58:20.7582294+08:00
EventsListeners: 2
Registry: https://index.docker.io/v1/
Experimental: true
Insecure Registries:
192.168.1.245
127.0.0.0/8
Live Restore Enabled: false
windows 容器的 Docker 和 Linux 容器的 Docker 之间的网络存在一些差异。 Windows 容器使用 HyperV 网络技术来提供 docker 使用的虚拟网络功能。有一些限制并不像您预期的那样有效,或者可能在标准 Docker 文档中找到。
- 首先,您无法通过以下方式访问容器内的 Web 端 运行 使用回溯地址 (127.0.0.1) 或主机地址 (192.168.1.xxx) 你必须调用它 总是来自远程机器。
- 我看到您在 Docker 文件中使用了 expose 命令。它不是 如此自我解释但暴露是暴露任何其他端口 网络然后是主机或入口网络。这不是问题,如果你 在非 swarm 配置中执行此操作,但它在 swarm 中不起作用。 我建议删除 Expose 命令。
- windows 网络存在一些未解决的问题。有时在容器重新启动后该端口仍在使用中。 例如,主机系统重启后。 [https://github.com/moby/moby/issues/21558][1]
使用此脚本,您可以删除所有虚拟网络设置:
Stop-Service docker
Get-ContainerNetwork | Remove-ContainerNetwork
Get-NetNat | Remove-NetNat
Get-VMSwitch | Remove-VMSwitch
Start-Service docker
我认为您需要以 "host" 模式发布端口 (docs.microsoft.com/en-us/virtualization/windowscontainers/… )。此外,它将是 运行ning 容器和主机之间的一对一端口映射,因此您将无法 运行 同一端口上的多个容器。路由网格尚未在 Windows 上运行。
由于 limitation of the WinNAT networking,您无法从同一台计算机访问容器的已发布端口。但是您可以使用外部请求到达所需的端口。
在您的示例中,从 而非 192.168.1.219
的计算机,使用 url http://192.168.1.219:5005/
访问将成功。如果请求来自这些机器之外,url 的 http://192.168.1.211:5005/
和 http://192.168.1.212:5005/
也会成功。
使用 'host' 模式会成功:但是,您没有获得 'routing mesh' 功能的优势,该功能允许从任何服务的节点访问服务 - 只能从那个一个节点。