我们需要部署docker容器的其中一台机器的eth0 IP设置在docker IPs范围内(172.17.0.1/16)。
问题是,当我们尝试通过NAT从外部访问此服务器(SSH等)时,一切都“挂起”。我猜这些数据包被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引擎,然后重新创建任何用户创建的网络和容器(通常最后两个步骤只涉及删除和重新部署compose项目或swarm堆栈) 。
请注意,目前尚不清楚您是否尝试连接到主机或容器。您不应该直接连接到外部的容器IP(极少数例外)。而是发布您需要能够从外部访问的所需端口,并连接到该已发布端口上的主机IP以到达容器。例如。
docker run -d -p 8080:80 nginx
将启动nginx与容器内的正常端口80通常无法到达外部。发布主机端口8080(可以很容易地是80以匹配容器端口)将连接映射到容器端口80。
一个重要的先决条件是容器内的应用程序必须侦听所有接口,而不仅仅是127.0.0.1,以便能够从该容器的网络命名空间外部访问它。