docker IP 范围内的 eth0 IP

eth0 IP in the docker IPs range

我们需要部署 docker 容器的其中一台机器的 eth0 IP 设置在 docker IP 范围内 (172.17.0.1/16)。

问题是,当我们尝试从外部(SSH 等)通过 NAT 访问此服务器时,所有内容 "hangs"。我猜数据包被 docker iptables 规则误导了。

如果我们无法更改 eth0 IP,在这种情况下有什么建议?

如果

Docker 在创建网络时看到所有正在使用的子网,则应该避免子网冲突。但是,如果您更改网络(例如笔记本电脑),则需要设置地址池供 docker 使用。这方面的步骤在我的幻灯片中: https://sudo-bmitch.github.io/presentations/dc2018eu/tips-and-tricks-of-the-captains.html#19

重要的细节是设置一个 /etc/docker/daemon.json 文件,其中包含:

{
  "bip": "10.15.0.0/24",
  "default-address-pools": [
    {"base": "10.20.0.0/16", "size": 24},
    {"base": "10.40.0.0/16", "size": 24}
  ]
}

根据需要调整 ip 范围。停止坏网络中的所有容器,删除容器,删除任何用户创建的网络,重新启动 docker 引擎,然后重新创建任何用户创建的网络和容器(通常最后两个步骤只涉及删除和重新部署组合项目或群堆栈)。


请注意,不清楚您是在尝试连接到您的主机还是容器。您不应该在外部直接连接到容器 IP(极少数例外)。相反,您发布需要能够从外部访问的所需端口,然后连接到该已发布端口上的主机 IP 以访问容器。例如

docker run -d -p 8080:80 nginx

将使用您通常无法从外部访问的容器内的正常端口 80 启动 nginx。发布主机端口 8080(可以很容易地是 80 以匹配容器端口)将连接映射到容器端口 80。

一个重要的先决条件是容器内的应用程序必须侦听所有接口,而不仅仅是 127.0.0.1,以便能够从该容器的网络命名空间外部访问它。