Docker 检查包含 ip 更改后的旧 ip 地址

Docker inspect contains old ip addresses after ip change

我用 node.js 应用程序创建 docker 容器(取决于来自 apocas 的 dockerode API),每个容器连接多个 docker 网络.默认情况下,每个容器都会为每个网络接口获得一个随机 IP 地址。

示例: dev-container with ip: 172.18.0.2 并在接口 [=] 上连接到网络 demo-net 30=]eth4

当我执行 docker inspect dev-container 时,我可以看到网络 demo-net 已连接到容器 dev-container IP 地址 172.18.0.2(如预期)。

现在我用 docker exec -it dev-container /bin/bash 执行 dev-container 并用 ifconfig eth4 192.168.99.169 netmask 255.255.240.0 配置 ip 地址。

结果:ifconfig显示新地址192.168.99.169连接到接口eth4。但是当我再次执行 docker inspect dev-container 时,仍然有旧地址 172.18.0.2 连接到网络 demo-net (不是预期的).

有没有一种方法 docker 可以更新内部网络设置,以便 docker inspect 将显示更新的 ip 设置,或者是否有更好的方法来更改容器的 ip 地址?

(Docker 版本为 19.03.12)

如果您尝试手动更改容器的网络配置,

Docker 将不会注意到。您可以 docker rm 您的容器并再次 docker run 它以使事情恢复一致状态。

打个比方,您可以尝试登录您的家庭 WiFi 路由器。它可能会说您的笔记本电脑是 192.168.1.2,您的打印机是 192.168.1.3。你当然可以 运行 ifconfig 将笔记本电脑的 IP 地址更改为 192.168.1.3/24,或更改为 10.20.30.40/16;但是如果你这样做你的路由器将不知道这是怎么回事,如果你尝试呼叫(或者如果你已经设置了反向 NAT 规则以允许入站呼叫返回),IP 路由将无法正常工作,如果您尝试打印,您可能会遇到奇怪的网络冲突。

Docker 完全管理容器的网络接口。没有理由在容器中 运行 ifconfigip 。 container-private IP 地址实际上是一个实现细节,在许多常见情况下是不可用的;我也会避免查找这个。您同样不需要手动设置它,但如果您这样做,"create a container" Docker API(基本上直接由 dockerode 公开)允许您指定 NetworkingConfig.