需求
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)