![从 docker 中删除暴露的端口](https://linux22.com/image/1420902/%E4%BB%8E%20docker%20%E4%B8%AD%E5%88%A0%E9%99%A4%E6%9A%B4%E9%9C%B2%E7%9A%84%E7%AB%AF%E5%8F%A3.png)
我正在从具有已发布端口 (3000) 的映像创建容器。我想发布一个新端口 (3030),并且只发布这一个,如果我使用,--publish 3030:3030
最终会发布两个端口 (3000 和 3030)。
是否有可能以某种方式从正在运行的容器中取消发布端口,或者我必须从头开始启动我的图像?
答案1
干净的方法是创建一个新镜像:通常,您总是希望您的 docker 容器和镜像是可重现的。如果您手动更改了与镜像不同的内容,那么您就失去了这种行为(管理您正在使用的基础设施的其他人会期望这样做)。
目前还没有干净的方法通过Docker 接口,但一定要检查他们的文档中是否有新的进展。
具体来说,错误报告(github 上可更改/可编辑的卷/端口)如果您感兴趣的话您可能想要评论/订阅。
目前,直接使用 iptables 管理 DNAT 是可行的方法。无论如何,docker 都是这样做的,但请注意,除了你想要的效果之外,我不确定它是否还有任何副作用(例如 docker 尝试重新添加这些规则等)。
首先,您必须在以下列表中查找转发端口:
iptables -t nat --行号--数字--列表
产生如下输出:
链 PREROUTING(策略接受) 数量 目标 保护 选项 源 目标 1 DOCKER 全部 -- 0.0.0.0/0 0.0.0.0/0 ADDRTYPE 匹配目标类型 LOCAL 链输入(策略接受) 数量 目标 保护 选项 源 目标 链输出(策略接受) 数量 目标 保护 选项 源 目标 1 DOCKER 全部 -- 0.0.0.0/0 !127.0.0.0/8 ADDRTYPE 匹配目标类型 LOCAL 链 POSTROUTING(策略接受) 数量 目标 保护 选项 源 目标 1 MASQUERADE 全部 -- 172.17.0.0/16 0.0.0.0/0 Chain DOCKER(2 个引用) 数量 目标 保护 选项 源 目标 1 DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:8080 至:172.17.1.1:80 2 DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:8081 至:172.17.1.2:80 3 DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:8082 至:172.17.1.3:80
然后,你可以使用以下命令删除匹配的规则
iptables -t nat -D DOCKER $num例如,要替换与端口 8081 匹配的规则,您必须使用
iptables -t nat -D DOCKER 2
享受!
答案2
docker create -p 127.0.0.1:0:3000
将端口 3000 暴露给仅绑定到本地主机接口的随机主机端口。这不是最好的解决方案,但可以确保端口无法从网络访问。
答案3
我启动了一个小脚本来从 docker 镜像中删除已注册的卷。它使用一种变通方法,即使用“ docker save
”将 tarball 分层,编辑元数据,然后“ docker load
”返回,包括历史记录。添加删除暴露端口的选项只是该脚本可以执行的另一个技巧。
看一下docker-copyedit- 如果定期出现不暴露端口的情况,它可能会有所帮助。