如何将Docker容器的指定端口流量重定向到本地不同端口?
实现Docker容器流量的域名+端口重定向
你已经通过--add-host完成了主机名到宿主机的映射,接下来要实现端口的重定向,可以用以下几种方法:
方法一:宿主机配置iptables端口转发
这种方法不需要修改容器内部配置,直接在宿主机上处理流量:
- 开启宿主机的IP转发功能:
如果需要永久生效,编辑echo 1 > /proc/sys/net/ipv4/ip_forward/etc/sysctl.conf,设置net.ipv4.ip_forward=1,然后执行sysctl -p加载配置。 - 添加iptables规则,将来自Docker容器的、目标端口443的流量重定向到宿主机5000端口:
iptables -t nat -A PREROUTING -i docker0 -p tcp --dport 443 -j REDIRECT --to-ports 5000 - 启动容器时继续使用
--add-host映射主机名:
注:docker run --add-host google.com:172.17.0.1 [你的镜像名]172.17.0.1是Docker默认网桥docker0的宿主机端IP,若使用自定义网桥,需替换为对应网桥的宿主机IP。
方法二:容器内配置iptables转发
如果不想修改宿主机规则,可以在容器内配置iptables,需要给容器赋予网络管理权限:
- 启动容器时添加
--cap-add NET_ADMIN权限(比--privileged更安全):docker run --add-host google.com:172.17.0.1 --cap-add NET_ADMIN [你的镜像名] - 进入容器后,添加iptables规则,将发往宿主机443端口的流量重定向到5000:
iptables -t nat -A OUTPUT -d 172.17.0.1 -p tcp --dport 443 -j REDIRECT --to-ports 5000
方法三:用socat工具实现端口转发
如果容器内没有iptables,也可以用socat工具做用户态的端口转发:
- 启动容器时先安装socat(以Debian/Ubuntu镜像为例):
docker run --add-host google.com:127.0.0.1 [你的镜像名] /bin/bash -c "apt-get update && apt-get install -y socat && socat TCP-LISTEN:443,fork TCP:172.17.0.1:5000 && [你的容器启动命令]" - 这里
--add-host google.com:127.0.0.1让容器访问google.com时指向自身,socat监听容器的443端口,将流量转发到宿主机的5000端口。
内容的提问来源于stack exchange,提问作者Sumit Gupta
相关产品推荐
相关产品推荐

