我有带 docker(20.10.12) 的 Linux Mint 主机。
在此主机上有两个容器,使用 simple 创建docker run
,未提供网络配置。:
- mysql,已发布端口 3306,
- grafana,已发布端口 3000。
两个容器都可以从外部访问(包括来自同一网络中的另一台主机)。但是我无法从 grafana 的容器连接到 msql。
对于连接,我使用主机的网络 IP (192.168.1.151)。
nc -zv 192.168.1.151 3306
从 grafana 的容器内部“挂起”并且不提供任何输出。奇怪的nc -zv 192.168.1.151 3000
是也“挂了”。
检查busybox
,同样的结果 -nc
也“挂断”。
检查一般网络问题:从容器内成功连接到路由器和 google.com 的 Web 界面。
还检查了我是否从容器内成功连接到主机本身的开放端口。
我知道我可以将两个容器链接到同一个 docker 网络,并完全跳过发布端口。但我更感兴趣的是解释为什么会这样。
当您在没有自定义桥接网络设置的情况下启动 Docker 容器时,Docker 会在默认桥接网络中启动它们。默认桥接网络具有不同的 IP 子网,无法通过主机 IP 地址进行路由。Docker 也通过默认桥接网络上的容器名称禁用 DNS 解析。这在他们的文档中提到
端口发布只是让宿主机上的应用程序连接容器成为可能。
这里的“IP地址”指的是容器在Docker默认桥接网络内的IP地址,不是宿主机IP地址。如果软件包安装在容器中,您可以通过命令从容器中获取 IP 地址
ip a
,或者通过检查容器从 Docker 主机获取 IP 地址使用这些 IP,您可以连接/验证连接性:
如果需要连接容器,可以创建自定义网络并加入容器。
现在,当您检查网络时,您会看到两个容器都在网络上。
您可以通过它们的容器名称连接到它们。