创建容器后手动映射端口

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了创建容器后手动映射端口相关的知识,希望对你有一定的参考价值。

参考技术A

[TOC]

一般我们在创建容器的时候都可以 -p 指定多个端口或者 -P 指定随机端口,但是比较麻烦的是我们在创建了容器之后又想映射多一个或者多个端口,但是这时候docker 又没有支持的命令进行操作。

那首先就需要先了解docker 端口映射是怎么一个工作原理了。

一般情况下,容器是可以访问外网,而外部网络是不能访问到容器的。

容器所有到外部网络的连接,源地址都会被NAT成本地系统的IP地址。这是使用 iptables 的源地址转换实现的。

查看宿主机的NAT表

可以看到上面的iptables的规则把所有源地址在 172.17.0.0/16 网段,目标地址为其他网段(外部网络)的流量都进行了转换(伪装)从宿主机的网卡发出。MASQUERADE 跟传统 SNAT 的好处是它能动态从网卡获取地址。

以上的端口转换是在创建容器时指定的:

使用 -p 命令来进行端口映射,在这里可以看出,当外部访问宿主机与容器所映射的端口时,iptables 的NAT表会对目的端口进行转换,转换为相应的容器的 ip:port

经过上面的分析我们知道了外部网络是如何访问带容器内部的。
因此我们需要添加 DNAT 规则以及允许访问宿主机的容器IP和端口。

测试
在容器中用 nc 监听一个端口

然后添加了上面两条防火墙规则后,再去测试能否连通宿主机的 123 端口

验证了是可以通的。

以上是关于创建容器后手动映射端口的主要内容,如果未能解决你的问题,请参考以下文章

DocKer 创建容器 镜像端口映射失败

已经创建 且运行一段时间的docker容器 添加新的映射端口

修改docker容器的端口映射

Socket.io - 客户端断开连接后手动重新连接

Docker基本控制命令(资源控制数据卷及数据卷容器镜像创建端口映射私有仓库)

在另一个工作流成功运行后手动触发 Github Actions 工作流