Windows的WSL中的Docker启动Postgresql如何对外暴露端口号

关键字

Windows,防火墙,WSL,Docker,Postgresql

背景环境

公司网络环境比较复杂,有些时候需要关闭一些本地服务,特别是数据库,Redis等。我为了隔离环境,恰好使用的Win11系统支持WSL2(比WSL更高效,占用更少的资源),所以我就把Postgresql,Redis等服务全在WSL中的Docker启动。

然后我想关闭这些环境时,只需要停止WSL的服务就行了。

但是,内网同事需要使用我的Postgresql,我就需要把我的Postgresql暴露出来。

原因分析

可行性分析:WSL和宿主机在同一局域网内。在Windows上开启5432端口,然后把访问转发到WSL上。

解决过程

查看WSL的IP

在宿主机的Windows PowerShell中,输入:

shell 复制代码
$wsl_ip = (wsl -e hostname -I).Trim()
echo $wsl_ip

# 输出:172.23.35.45 172.17.0.1

可以看到有两个ip地址:

  • 172.23.35.45 - 这是WSL2虚拟机的实际IP地址,用于与主机(Windows)通信
  • 172.17.0.1 - 这是Docker默认网桥的IP地址(如果你安装了Docker)

也可以在WSL中通过命令行查看IP。

在docker中启动Postgresql(省略)

测试宿主机是否直接访问Postgresql服务

在宿主机的Windows PowerShell中,输入:

shell 复制代码
Test-NetConnection -ComputerName 127.0.0.1 -Port 5432

必须要能访问。

设置端口转发

创建Powershelll脚本 wsl_port_forward.psl

shell 复制代码
netsh interface portproxy reset

# 设置端口转发
netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=5432 connectaddress=172.23.35.45 connectport=5432 

# 查看端口代理
netsh interface portproxy show all

# 代理结果
侦听 ipv4:                 连接到 ipv4:

地址            端口        地址            端口
--------------- ----------  --------------- ----------
0.0.0.0         5432        172.23.35.45    5432

测试内网是否可以访问?

在宿主机的Windows PowerShell中,输入:

10.18.148.140为内网IP

shell 复制代码
Test-NetConnection -ComputerName 10.18.148.140 -Port 5432

如果成功,那就成功了。

如果不成功,就要排查宿主机的Windows防火墙问题。

排查宿主机的Windows防火墙

可以先简单临时关闭防火墙,Powershell:

shell 复制代码
# 临时关闭防火墙:
Set-NetFirewallProfile -Profile Domain,Public,Private -Enabled False

# 再次测试
Test-NetConnection -ComputerName 10.18.148.140 -Port 5432

# 开启防火墙
Set-NetFirewallProfile -Profile Domain,Public,Private -Enabled True

如果测试成功,那么就是Windows防火墙的问题。

配置Windows防火墙的入站规则

理解入站:
关键概念 入站规则(Inbound) 出站规则(Outbound)
作用 控制外部设备访问本机的流量 控制本机访问外部设备的流量
场景 内网设备访问 Windows 的 5432 端口 不需要配置(除非 PostgreSQL 主动向外连接)

如何区分,别人访问你,就是入站,你要访问别人就是出站。

打开防火墙设置:

(1) 搜索并打开 高级安全 Windows Defender 防火墙。

(2) 选择 入站规则(Inbound Rules) → 右侧点击 新建规则。

配置规则:

(1) 规则类型:端口 → 下一步。

(2) 协议和端口:选择 TCP,输入 特定端口:5432 → 下一步。

(3) 操作:允许连接 → 下一步。

(4) 配置文件:勾选 域、专用、公用(根据你的网络环境选择)→ 下一步。

(5) 名称:填写 PostgreSQL 5432 入站 → 完成。

总结

比较常用的场景,记录一下。

个人博客:qinyangx.top

相关推荐
Johny_Zhao8 分钟前
Docker + CentOS 部署 Zookeeper 集群 + Kubernetes Operator 自动化运维方案
linux·网络安全·docker·信息安全·zookeeper·kubernetes·云计算·系统运维
zwjapple1 小时前
docker-compose一键部署全栈项目。springboot后端,react前端
前端·spring boot·docker
代码老y3 小时前
Docker:容器化技术的基石与实践指南
运维·docker·容器
程序视点3 小时前
Window 10文件拷贝总是卡很久?快来试试这款小工具,榨干硬盘速度!
windows
wuk9983 小时前
基于MATLAB编制的锂离子电池伪二维模型
linux·windows·github
DuelCode4 小时前
Windows VMWare Centos Docker部署Springboot 应用实现文件上传返回文件http链接
java·spring boot·mysql·nginx·docker·centos·mybatis
lzb_kkk4 小时前
【C++】C++四种类型转换操作符详解
开发语言·c++·windows·1024程序员节
杨浦老苏8 小时前
开源服务运行监控工具Lunalytics
docker·群晖·网站监控
Paper_Love12 小时前
x86-64_windows交叉编译arm_linux程序
arm开发·windows
前端若水12 小时前
通过 Windows 共享文件夹 + 手机访问(SMB协议)如何实现
windows·智能手机