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

相关推荐
weixin_307779139 分钟前
Redis Windows迁移方案与测试
c++·windows·redis·算法·系统架构
auspicious航2 小时前
PostgreSQL 高可用与负载均衡
数据库·postgresql
小白不想白a3 小时前
【docker】namespace 命名空间
运维·docker·容器
忘忧人生3 小时前
docker 容器常用命令
java·docker·容器
小z博客3 小时前
使用Docker轻松部署Zurl搭建自己的短链接服务
运维·docker·容器
老七秘制小程序6 小时前
在Jetson AGX Orin上将docker目录挂载到大容量硬盘目录
docker·容器·eureka·json
longze_76 小时前
Docker国内可用镜像(2025.08.06测试)
docker·docker镜像
陈陈爱java7 小时前
实习文档背诵
linux·服务器·windows
测试界8 小时前
部署Web UI自动化测试平台:SeleniumFlaskTester
windows·selenium·flask
隐-梵11 小时前
2025年测绘程序设计模拟赛一--地形图图幅编号及图廓点经纬度计算
windows·经验分享·visualstudio·c#