从 docker 中删除暴露的端口

Oli*_*ier 9 docker

我正在从具有已发布端口 (3000) 的映像创建容器。我想发布一个新端口 (3030),只有这个,如果我使用,--publish 3030:3030我最终会发布两个端口(3000 和 3030)。

是否可以以某种方式从正在运行的容器中取消发布端口,或者我是否必须从头开始我的映像?

deu*_*ion 10

干净的方法是创建一个新图像:通常,您总是希望您的 docker 容器和图像是可重现的。如果您手动更改与您的图像有偏差的某些内容,您就会剥夺自己的这种行为(管理您正在工作的基础设施的其他人会期望的)。

目前没有通过Docker API做到这一点的干净方法,但请务必检查他们的文档中是否有新的开发。

具体来说,有一个错误报告(github 上的可更改/可编辑卷/端口),如果您感兴趣,您可能想要评论/订阅。

现在,直接使用 iptables 管理 DNAT 是可行的方法。无论如何,docker 都是这样做的,但请注意,除了您想要的效果之外,我不确定它是否有任何副作用(例如 docker 试图重新添加这些规则等)

首先,您必须在以下列表中查找转发端口:

iptables -t nat --line-numbers --numeric --list

它产生这样的输出:

Chain PREROUTING(策略接受)
num 目标 prot 选择源目标
1 DOCKER all -- 0.0.0.0/0 0.0.0.0/0 ADDRTYPE 匹配 dst-type LOCAL

链输入(政策接受)
num 目标 prot 选择源目标

链输出(政策接受)
num 目标 prot 选择源目标
1 DOCKER all -- 0.0.0.0/0 !127.0.0.0/8 ADDRTYPE 匹配 dst-type LOCAL

链POSTROUTING(策略接受)
num 目标 prot 选择源目标
1 全部伪装 -- 172.17.0.0/16 0.0.0.0/0

链式 DOCKER(2 个参考)
num 目标 prot 选择源目标
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

享受!