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

相关推荐
Patrick_Wilson4 天前
从「改个端口」到 502:Next.js on k8s 的容器端口、Service 映射与 env 覆盖
docker·kubernetes·next.js
Suroy4 天前
DockerView-Go:用 Go 写一个终端 Docker 监控工具,顺便做了个 Web 仪表盘
docker
云恒要逆袭4 天前
运行你的第一个Docker容器
后端·docker·容器
宋均浩5 天前
# Docker 镜像瘦身实战:从 1.2G 到 80MB 的五个优化步骤
ci/cd·docker
程序员老赵6 天前
10 分钟部署 OpenCode:Docker 一键安装,浏览器打开就能用 AI 写代码(附完整命令与排错)
docker·容器·ai编程
WangMingHua1116 天前
LM Studio Docker 部署——本地大模型一键启动
docker
曲幽7 天前
别再用网页翻译看源码了!你的私人翻译神器LibreTranslate,部署避坑指南来了
python·docker·web·pot·translate·libretranslate·arogstranslate
武子康9 天前
调查研究-183 Apple container:Mac 上用轻量 VM 跑 Linux 容器,Swift 会改写本地容器体验吗?
docker·容器·apple
qq_3692243312 天前
Windows全系通用!ntdll.dll文件丢失、报错、闪退问题的完整排查与修复教程
windows·dll·dll修复·dll丢失·dll错误
Alsn8612 天前
等待学习-学习目录:Docker 容器安全攻防
学习·安全·docker