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

相关推荐
诡异森林。16 分钟前
Docker--利用dockerfile搭建mysql主从集群和redis集群
redis·mysql·docker
虾球xz39 分钟前
游戏引擎学习第213天
c++·windows·学习·游戏引擎
北京_宏哥1 小时前
🔥PC端自动化测试实战教程-3-pywinauto 启动PC端应用程序 - 下篇(详细教程)
前端·windows·python
NorthCastle1 小时前
Docker 镜像 的常用命令介绍
运维·docker·容器·docker 镜像
被子你放开我1 小时前
Docker 安装CRMEB陀螺匠教程
运维·docker·容器
卜及中2 小时前
【Docker基础】深入解析 Docker 存储卷:管理、绑定与实战应用
运维·docker·容器
pound1272 小时前
第五章.python函数
windows·python·microsoft
张青贤3 小时前
Docker 常用使用命令
运维·docker·容器
东风微鸣3 小时前
管理大规模监控技术栈的最佳实践
docker·云原生·kubernetes·可观察性
~卷心菜~4 小时前
【Docker基础-镜像】--查阅笔记2
docker·容器