【Docker之轨迹】为正在运行中的容器动态添加端口映射

需求

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 行不通,转而使用端口映射的方法,就成功了

—— 特此记录


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

posted @ 2021-10-06 13:07  IceClean  阅读(213)  评论(0)    收藏  举报