从 docker 中删除暴露的端口

从 docker 中删除暴露的端口

我正在从具有已发布端口 (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- 如果定期出现不暴露端口的情况,它可能会有所帮助。

相关内容