1. 容器端口映射的核心机制
当我们在Docker环境中运行一个Nginx容器时,典型的启动命令是这样的:
bash复制docker run -d -p 8080:80 --name my_nginx nginx
这个命令背后的端口映射机制实际上涉及Linux内核的netfilter框架。当数据包到达宿主机的8080端口时,经过以下处理流程:
- PREROUTING链中的DNAT规则将目标端口从8080改写为80
- 根据CONTAINER-USER链的规则将数据包路由到容器的虚拟网卡
- 容器处理完响应后,通过POSTROUTING链的MASQUERADE规则进行源地址转换
这种映射关系在容器创建时就被写入iptables规则链,这也是为什么直接修改运行中容器的端口映射如此困难。通过命令iptables -t nat -L -n可以观察到这些自动生成的规则。
2. 方案一:动态修改iptables规则
2.1 定位现有映射规则
首先需要精确找到目标容器的现有规则。通过以下命令组合可以准确定位:
bash复制CONTAINER_IP=$(docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' my_container)
iptables -t nat -L -n --line-numbers | grep $CONTAINER_IP
典型输出示例:
code复制Chain DOCKER (2 references)
num target prot opt source destination
3 DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:8080 to:172.17.0.2:80
2.2 安全删除旧规则
删除规则时必须指定精确的链和规则编号:
bash复制iptables -t nat -D DOCKER 3
重要提示:务必先备份现有规则
iptables-save > iptables.backup,错误的规则修改可能导致网络中断。
2.3 添加新映射规则
新建规则的命令需要完
解锁全文
加入我们的会员,获取最新、最热、最精彩的开发者技术内容