我们需要部署docker容器的机器之一将eth0 IP设置为docker IP范围(172.17.0.1/16)。
问题是,当我们尝试从外部(SSH等)通过NAT访问此服务器时,一切都“挂起”。我猜这些数据包因docker iptables规则而被误导了。
如果我们不能更改eth0 IP,在这种情况下的建议是什么?
答案 0 :(得分:1)
如果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,以便能够从该容器的网络名称空间之外访问它。