为什么docker允许我在192.168.8.101:8082和localhost上运行容器,但不允许在其他IP上运行容器

问题描述 投票:0回答:2

您好我在我的macOS Sierra 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我的本地计算机和设备(iPhone)连接到同一个wifi网络(我也没有问题在localhost上运行容器)。

但是,当我尝试在其他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,但没有成功,我不知道为什么。有人拄着拐杖给我建议(和/或指示我应该提供哪些更多信息来解决这个问题)?我想知道:为什么我不能使用其他IP以及我可以做些什么来使用其他IP?

UPDATE - additional informations:

执行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
macos docker ip-address static-ip-address local-network
2个回答
1
投票

ifconfig(linux,OSX)或ipconfig(Windows)的输出可能会告诉你,你的IP4是192.168.8.101

这就是192.168.8.101:8082:80工作的原因。 Docker可以访问端点,并可以在80的端口8082上映射其容器的端口192.169.8.101

当您使用另一个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这个命令的输出将返回像"Subnet": "172.17.0.0/16"这样的子网。每个容器在此私有范围之间都有一个IP。

你实际上在做的是在172.17.X.X:80上映射192.168.8.101:8082,当你可以从你的机器上访问192.168.8.101时它可以工作。


0
投票

我怀疑你以前的容器仍然使用端口8082尝试使用另一个端口。 。我不知道如何检查mac中使用过的端口,但如果它在linux中你可以用netstat -ntlp检查你的开放端口

© www.soinside.com 2019 - 2024. All rights reserved.