为什么 docker 允许我在 192.168.8.101:8082 和本地主机上 运行 容器而不是其他 IP
Why docker allow me to run container on 192.168.8.101:8082 and localhost but not on other IPs
您好,我在我的 macOS Sierr High 上有以下 dockerfile(例如):
FROM richarvey/nginx-php-fpm:1.3.7
EXPOSE 80
而且我能够通过
在 192.168.8.101:8082 上构建并运行它
docker build -t myproject
docker run -d -p 192.168.8.101:8082:80 --name myproject myproject
它可以在 http://192.168.8.101:8082 我的本地计算机和连接到同一个 wifi 网络的设备 (iPhone) 上运行(我对本地主机上的 运行 容器也没有问题)。
然而,当我在其他 IP 上尝试 运行 这个容器时,例如 192.168.8.102:8082,我得到以下错误:
Mac-mini-Kamil:myproject Kamil$ docker run -d -p 192.168.8.102:8082:80 --name myproject myproject
f939d38243f420f812c859f5fe275faf49dc6e123d807583ec240fbdf0619a17
docker: Error response from daemon: driver failed programming external connectivity on endpoint myproject (0b546e63887e3ddeb4d2b21a8d6d15a94e33f1ff67c2765174a808bf6b13e120): Error starting userland proxy: listen tcp 192.168.8.102:8082: bind: cannot assign requested address.
我也尝试了其他地址,例如 172.17.1.2,但没有成功,我也不知道为什么。有人可以给我建议吗(and/or 说明我应该为这个问题提供哪些更多信息来解决它)?我想知道:为什么我不能使用其他IP以及如何使用其他IP?
更新 - 附加信息:
执行后 ifconfig
我选择了两个有趣的结果:
en1: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
ether a8:8e:24:a3:d3:91
inet6 fe80::18fe:1146:6389:b630%en1 prefixlen 64 secured scopeid 0xa
inet 192.168.8.101 netmask 0xffffff00 broadcast 192.168.8.255
nd6 options=201<PERFORMNUD,DAD>
media: autoselect
status: active
bridge0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
options=63<RXCSUM,TXCSUM,TSO4,TSO6>
ether 32:00:11:fc:70:40
Configuration:
id 0:0:0:0:0:0 priority 0 hellotime 0 fwddelay 0
maxage 0 holdcnt 0 proto stp maxaddr 100 timeout 1200
root id 0:0:0:0:0:0 priority 0 ifcost 0 port 0
ipfilter disabled flags 0x2
member: en2 flags=3<LEARNING,DISCOVER>
ifmaxaddr 0 port 9 priority 0 path cost 0
nd6 options=201<PERFORMNUD,DAD>
media: <unknown type>
status: inactive
我怀疑你以前的容器还在使用端口8082
尝试使用另一个端口。 .我不知道如何检查 mac 中使用的端口,但如果它在 linux 中,你可以使用 netstat -ntlp
检查你的开放端口
ifconfig
(linux, OSX) 或 ipconfig
(Windows) 的输出可能会告诉你你的 IP4 是 192.168.8.101
.
这就是 192.168.8.101:8082:80
起作用的原因。 Docker 可以访问端点并且可以将其容器的端口 80
映射到 192.169.8.101
的端口 8082
。
当您使用其他 IP 时,会弹出此错误:
Error response from daemon: driver failed programming external connectivity on endpoint
这意味着您的 Docker 守护程序无法访问端点 192.168.8.102
这是合乎逻辑的,因为它不是您机器的 IPV4 地址。
bridge0
网络是默认的 Docker 网络。如果您未指定网络,您的 Docker 容器将部署在此网络内。
你可以这样做:docker inspect network bridge
此命令的输出将 return 一个类似于 "Subnet": "172.17.0.0/16"
的子网。每个容器在这个私有范围内都有一个 IP。
你实际上在做的是将 172.17.X.X:80
映射到 192.168.8.101:8082
上,这在你的机器可以访问 192.168.8.101
时起作用。
您好,我在我的 macOS Sierr High 上有以下 dockerfile(例如):
FROM richarvey/nginx-php-fpm:1.3.7
EXPOSE 80
而且我能够通过
在 192.168.8.101:8082 上构建并运行它docker build -t myproject
docker run -d -p 192.168.8.101:8082:80 --name myproject myproject
它可以在 http://192.168.8.101:8082 我的本地计算机和连接到同一个 wifi 网络的设备 (iPhone) 上运行(我对本地主机上的 运行 容器也没有问题)。
然而,当我在其他 IP 上尝试 运行 这个容器时,例如 192.168.8.102:8082,我得到以下错误:
Mac-mini-Kamil:myproject Kamil$ docker run -d -p 192.168.8.102:8082:80 --name myproject myproject
f939d38243f420f812c859f5fe275faf49dc6e123d807583ec240fbdf0619a17
docker: Error response from daemon: driver failed programming external connectivity on endpoint myproject (0b546e63887e3ddeb4d2b21a8d6d15a94e33f1ff67c2765174a808bf6b13e120): Error starting userland proxy: listen tcp 192.168.8.102:8082: bind: cannot assign requested address.
我也尝试了其他地址,例如 172.17.1.2,但没有成功,我也不知道为什么。有人可以给我建议吗(and/or 说明我应该为这个问题提供哪些更多信息来解决它)?我想知道:为什么我不能使用其他IP以及如何使用其他IP?
更新 - 附加信息:
执行后 ifconfig
我选择了两个有趣的结果:
en1: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
ether a8:8e:24:a3:d3:91
inet6 fe80::18fe:1146:6389:b630%en1 prefixlen 64 secured scopeid 0xa
inet 192.168.8.101 netmask 0xffffff00 broadcast 192.168.8.255
nd6 options=201<PERFORMNUD,DAD>
media: autoselect
status: active
bridge0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
options=63<RXCSUM,TXCSUM,TSO4,TSO6>
ether 32:00:11:fc:70:40
Configuration:
id 0:0:0:0:0:0 priority 0 hellotime 0 fwddelay 0
maxage 0 holdcnt 0 proto stp maxaddr 100 timeout 1200
root id 0:0:0:0:0:0 priority 0 ifcost 0 port 0
ipfilter disabled flags 0x2
member: en2 flags=3<LEARNING,DISCOVER>
ifmaxaddr 0 port 9 priority 0 path cost 0
nd6 options=201<PERFORMNUD,DAD>
media: <unknown type>
status: inactive
我怀疑你以前的容器还在使用端口8082
尝试使用另一个端口。 .我不知道如何检查 mac 中使用的端口,但如果它在 linux 中,你可以使用 netstat -ntlp
ifconfig
(linux, OSX) 或 ipconfig
(Windows) 的输出可能会告诉你你的 IP4 是 192.168.8.101
.
这就是 192.168.8.101:8082:80
起作用的原因。 Docker 可以访问端点并且可以将其容器的端口 80
映射到 192.169.8.101
的端口 8082
。
当您使用其他 IP 时,会弹出此错误:
Error response from daemon: driver failed programming external connectivity on endpoint
这意味着您的 Docker 守护程序无法访问端点 192.168.8.102
这是合乎逻辑的,因为它不是您机器的 IPV4 地址。
bridge0
网络是默认的 Docker 网络。如果您未指定网络,您的 Docker 容器将部署在此网络内。
你可以这样做:docker inspect network bridge
此命令的输出将 return 一个类似于 "Subnet": "172.17.0.0/16"
的子网。每个容器在这个私有范围内都有一个 IP。
你实际上在做的是将 172.17.X.X:80
映射到 192.168.8.101:8082
上,这在你的机器可以访问 192.168.8.101
时起作用。