简述
项目需要,需要在Windows系统上部署一些轻量级的服务,但部署虚拟机比较繁琐,因此否定了这个方案。经过一番调研,计划在Window系统上使用Docker。
Rancher desktop安装部署后,docker运行良好,安装部署不再叙述,可以使用docker run命令部署容器也可使用docker-compose编排多个容器。
问题描述
由于项目需要,需要在容器内映射几个udp和tcp的端口到宿主机,供外部应用访问。如何映射端口不再累述,通过docker命令的-p参数可以映射端口,具体可以自行搜索。但实际部署后,发现tcp端口工作正常,但udp端口却无法正常访问。
解决方案
经过一通百度,也没有找到可行的解决方案,不得已,只能自行使用工具进行端口转发。
Windows的docker功能实现是通过windows自带的wsl linux子系统实现的,如上图所示。在powershell中,可通过输入wsl命令进入linux子系统,在linux子系统中,测试映射的各端口,均是正常的。因此端口映射的问题,应该是出在了windows到wsl子系统之间。
通过命令ifconfig查看wsl子系统的ip地址,然后在windows系统的cmd中ping,两者是互通的。因此我们可以将wsl子系统看做一个单独的虚拟机,通过goproxy进行udp端口的转发。(原理相同,也可通过别的代理工具)
proxy.exe udp -p 20000 -T udp -P XXX:0 //其中XXX代表的是wsl子系统的ip地址
经过测试,业务功能均正常。至此已经可以实现udp端口的转发。
另外有几个需要注意的问题。
1、proxy如果要映射udp端口一个范围,例如20000-20010,官方给出的示例是可以通过“20000-20010”这种方式转发的,但是实际测试时,发现端口不通,单个端口均正常,由于映射的端口不多,因此也没有细究原因。
2、wsl子系统的ip,每次开启都是随机变化的,网上也有一些固定wsl ip地址的方法,但操作比较麻烦,没有尝试。我们写了个脚本每次开机通过“wsl sh /root/getip.sh>tmp.dat ”命令的方法自行获取,获取完成后再做proxy的端口映射命令。
//getip.sh内容
ifconfig eth0 | egrep -o "([0-9]{1,3}\.){3}[0-9]{1,3}" | head -n 1