我的 docker 主机在 172.17.0.1 上监听。
我可以从主机卷曲它,但是当我从容器内卷曲相同的 ip/端口时,我会超时。
我可以从容器中 ping 任何东西,但我无法访问主机。
我错过了什么?
Container 是通过以下命令运行的 Jenkins 镜像:
docker run -d --name jenkins -v jenkins_home:/var/jenkins_home -p 8080:8080 -p 50000:50000 jenkins/jenkins:2.222.3
在主机上运行 curl:
curl http://172.17.0.1:2375 {“消息”:“找不到页面”}
使用 docker 运行 curl 将超时。
curl http://172.17.0.1:2375 curl: (7) 连接172.17.0.1端口2375失败:连接超时
这通常是因为主机上的 iptables 阻止了来自 docker 网络的访问。您可以查看
iptables -S
或iptables -nvL
查看您当前的规则。也就是说,如果您确实打开了 docker API,则需要注意谁可以访问该 API。使用端口 2375 通常意味着您尚未配置 mTLS,请参阅 docker的设置 mTLS 指南。这意味着任何有权访问该端口的人都可以提交 API 调用,这意味着非特权本地用户或任何其他容器都可以在您的主机上获得 root 权限。在您的情况下,这很简单:
推荐的解决方案是使用 DinD 在容器内运行 docker 引擎,或者将 docker 套接字共享为文件/卷挂载,并具有对文件的适当 UID/GID 访问权限。这确保只有容器可以访问 docker 引擎,而不是所有用户和主机上运行的任何容器。为了处理安装在卷中的文件的 UID/GID 访问问题,我专门针对我的 jenkins-docker 存储库中的 Jenkins 映像完成了此操作,并且在我的docker- base 存储库中的 fix-perms 脚本中有一个更通用的解决方案。
@BMitch-我已经弄清楚了-但是您也做对了(如果您将其发布为答案,我将接受并删除我的答案),iptables 阻止了访问。一旦我打开它 - 它按预期工作。