【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)

浙公网安备 33010602011771号