【发布时间】:2021-02-01 07:01:16
【问题描述】:
我必须使用 ip 192.168.31.11 创建容器。因此,我使用了用户定义的桥接网络并将 mynet 创建为:
docker network create \
--driver=bridge \
--subnet=192.168.31.0/24 \
--ip-range=192.168.31.0/24 \
--gateway=192.168.31.1 \
mynet
现在,使用命令
docker run --network mynet --name ca1 --ip 192.168.31.11 -itd -p 8002:80 -v $PWD:/build sc5
我已经创建了容器。 docker 主机现在有下面的 ifconfig:
br-426eea85deb3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 metric 1
inet 192.168.31.1 netmask 255.255.255.0 **broadcast 192.168.31.255**
inet6 fe80::42:cfff:fe3e:d01b prefixlen 64 scopeid 0x20<link>
ether 02:42:cf:3e:d0:1b txqueuelen 0 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 7 bytes 586 (586.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500 metric 1
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:58:0e:02:97 txqueuelen 0 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 metric 1
inet 192.168.31.101 netmask 255.255.255.0 **broadcast 192.168.31.255**
inet6 fe80::202:6bff:fe21:463c prefixlen 64 scopeid 0x20<link>
ether 00:02:6b:21:46:3c txqueuelen 1000 (Ethernet)
RX packets 16 bytes 1440 (1.4 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 65 bytes 3216 (3.1 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
device memory 0xdf000000-df01ffff
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 metric 1
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 509 bytes 37544 (36.6 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 509 bytes 37544 (36.6 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
vethda02539: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 metric 1
inet6 fe80::f072:a4ff:fe51:18bb prefixlen 64 scopeid 0x20<link>
ether f2:72:a4:51:18:bb txqueuelen 0 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 14 bytes 1172 (1.1 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
但是,当我从主机到容器对容器执行 ping 操作时,ping 失败!!。
但是当我使用 /etc/sysconfig/network 更改 docker 主机网络设置时,主机 ip 从 192.168.31.101 到 192.168.11.101时间>。主机到容器的 ping 成功!!
我无法理解在第一种情况下阻止 ping 成功的原因是什么!?
我已经在 ubuntu 机器上尝试了相同的方法,方法是使用与主机和容器 br-xxxx 广播相同的广播 xx.xx.xx.xx 创建 mynet。在这台 Ubuntu 机器上 ping 成功了!!
ubuntu 案例详情如下:
ifconfig:
br-7b1ed572fe95: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.0.2.2 netmask 255.255.255.0 **broadcast 10.0.2.255**
inet6 fe80::42:bff:fe9d:d6eb prefixlen 64 scopeid 0x20<link>
ether 02:42:0b:9d:d6:eb txqueuelen 0 (Ethernet)
RX packets 97 bytes 12767 (12.7 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 61 bytes 6739 (6.7 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:11:f0:da:29 txqueuelen 0 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
enp0s3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.0.2.15 netmask 255.255.255.0 **broadcast 10.0.2.255**
inet6 fe80::365a:ddd:b83c:4abe prefixlen 64 scopeid 0x20<link>
ether 08:00:27:82:79:c2 txqueuelen 1000 (Ethernet)
RX packets 14188 bytes 15705468 (15.7 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 3415 bytes 264989 (264.9 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 1727 bytes 141367 (141.3 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 1727 bytes 141367 (141.3 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
veth11ef32e: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet6 fe80::b014:feff:feaa:cea3 prefixlen 64 scopeid 0x20<link>
ether b2:14:fe:aa:ce:a3 txqueuelen 0 (Ethernet)
RX packets 97 bytes 14125 (14.1 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 87 bytes 9899 (9.8 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
我很困惑,不知道为什么在 192.xx.xx.xx 情况下 ping 失败,而在 Windows VM 上的 Ubuntu 情况下成功?
我是不是缺少 docker host 的一些东西?
任何帮助或指导将不胜感激。请让我知道是否需要更多信息或细节来进一步理解相同的建议。 谢谢,
【问题讨论】:
-
您说您已经在 ubuntu 机器上尝试过相同的操作。什么机器遇到问题?你在虚拟机中运行 docker 吗?例如,这是在 mac 还是 windows 机器上?
-
@SoftwareEngineer,感谢您的回复。在第一种情况下,我使用运行 Linux 的 x86 英特尔芯片在嵌入式产品上运行(使用 Timesys)。是的,这是我在后来的 ubuntu 案例中尝试使用 Ubuntu 的带有 VM 的 Windows 机器。
-
您通常不需要手动设置容器 IP 地址,或向容器发送 ICMP 数据包。 (对于非 Docker 进程,您不会做任何这些事情。)在大多数情况下,您应该完全忽略容器私有 IP 地址,因为它们只在同一主机上工作,然后当该主机是本机 Linux 时.您想通过此设置实现更高级别的目标吗?
-
@DavidMaze,是的,大卫。我只需要具有该特定私有 IP 的容器。不能使用 172.x.x.x 范围分配的默认 ip。简而言之,我将使用这个 192.168.31.11 来启动 html 页面并进一步进行用户交互以接收输入并使用卷存储它们。 ip 根据要求具有相互依赖关系。
标签: docker networking containers docker-networking docker-network