【Docker之轨迹】为正在运行中的容器动态添加端口映射(使用 iptables,附删除 iptables 规则)

需求

docker 中为容器添加端口映射只能在启动容器时(即 run)添加,而一旦启动完毕后,docker 就不再提供端口映射的功能,那我们可以绕开 docker,自己手动添加吗?答案是可以的!

一番查找后,我了解到 docker 添加端口映射实际上是基于 iptables 实现的,所以只要修改里边的映射规则,就可以作用到 docker 容器上了,步骤如下:

① 获取容器 IP

可以进入到容器,通过 ifconfig 拿到容器的 IP 地址,如下:
当然,如果有为容器固定 IP 地址的,话也可以直接用那个 IP 地址
在这里插入图片描述
② 直接绑定

格式如下:
iptables -t nat -A DOCKER -p tcp --dport <主机端口> -j DNAT --to-destination <容器IP地址>:<容器端口>

③ 查看是否映射成功

后期动态映射的接口,在 docker ps [-a] 中是看不到的,可以直接通过 iptables 查看:

iptables -t nat -nvL

看到如下图,就是映射成功啦!
在这里插入图片描述


—— 笔录:

这个需求是在使用 Docker 搭建 Hadoop 集群时,无法通过 nginx 转发到 hdfs 的 8020 端口而产生的

在使用这种方法时,由于集群 IP 全是内网,无法通过外网访问,我第一时间想到的是使用 nginx 进行代理,转发到内网容器中,刚开始确实用的好好的,但后来发现使用 Java 访问时,这种转发机制不管用了

因为 nginx 的 proxy_pass 只能转发以 http 或者 https 开头的链接,而 hadoop 的这个链接是 hdfs 开头的,直接访问不了,会出现如下错误:

It looks like you are making an HTTP request to a Hadoop IPC port. This is not the correct port for the web interface on this daemon.

想了很久之后,才发现用 nginx 行不通,转而使用端口映射的方法,就成功了

—— 特此记录


2021-10-24 补充

映射规则添加错了咋整,今晚找了挺久也没个头绪(主要是没认真学这个指令叭 <_<)
确实是一心想找到一个简单的命令,然后执行完事,但发现网上和自己实践的东西还是有特定场景差别的不能照搬(好在查了那么多终于摸出个缘由来),如下:

1)	查看规则并且显示行号
	iptables -t nat -L DOCKER --line-numbers

2)	删除指定行号的规制
	iptables -t nat -D DOCKER 2

在这里插入图片描述
可以看到成功删除啦!!!(写出这两条指令可真不容易)

现在就来解释下各个参数:

  • -t nat:-t 表示要选择那一张标,由于我们前边是添加在 nat 表,所以这里也指定为 nat 表
  • -L DOCKER:-L 表示指定哪一条 chain(链),上面我们查询时,明显看到添加的规则处在 Chain DOCKER 中,这里就指定为该链进一步缩小范围
  • –line-numbers:表示显示行号,方便我们删除
  • -D DOCKER 2:-D 表示删除规则,后边接 DOCKER 表示在 DOCKER 这条 chain 中删除,2 表示删除这条链的第二个规则

至此,删除步骤也挺清晰的啦


虽一事无成,却步履天涯(IceClean)

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

寒冰小澈IceClean

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值