无法从容器内部 ping/访问 172.17.0.1 上的 docker 主机

无法从容器内部 ping/访问 172.17.0.1 上的 docker 主机

我的docker主机监听172.17.0.1。

我可以从主机卷曲它,但是当我从容器内卷曲相同的 ip /端口时我会超时。

我可以从容器内 ping 任何东西,但无法访问主机。

我错过了什么?

容器是通过以下命令运行的 Jenkins 镜像:

docker run -d --name jenkins -v jenkins_home:/var/jenkins_home -p 8080:8080 -p 50000:50000 jenkins/jenkins:2.222.3

在主机上运行 curl:

卷曲http://172.17.0.1:2375{“message”:“页面未找到”}

在 docker 内部运行 curl 将会超时。

卷曲http://172.17.0.1:2375curl:(7)无法连接到 172.17.0.1 端口 2375:连接超时

答案1

这通常是因为主机上的 iptables 阻止了来自 docker 网络的访问。您可以查看iptables -Siptables -nvL查看当前规则。


也就是说,如果你确实开放了 Docker API,你需要小心谁可以访问该 API。使用端口 2375 通常意味着你没有配置 mTLS,请参阅docker 设置 mTLS 的指南。这意味着任何有权访问端口的人都可以提交 API 调用,这意味着没有特权的本地用户或任何其他容器都可以在您的主机上获得 root 权限。对于您来说,这很简单:

docker -H tcp://172.17.0.1:2375 run -it --rm --privileged --pid host debian nsenter -t 1 -m -u -n -i bash

推荐的解决方案是使用 DinD 在容器内运行 docker 引擎,或者将 docker 套接字作为文件/卷挂载共享,并具有对文件的适当 UID/GID 访问权限。这确保只有该容器可以访问 docker 引擎,而不是所有用户和主机上运行的任何容器。为了处理卷中挂载文件的 UID/GID 访问问题,我专门为 Jenkins 镜像做了这件事jenkins-dockerrepo 中有一个更通用的解决方案我的 docker-base repo 中的 fix-perms 脚本

答案2

@BMitch - 我已经弄明白了 - 但你也做对了(如果你将其作为答案发布,我会接受并删除我的答案)iptables 阻止了访问。一旦我打开它 - 它就会按预期工作。

相关内容