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

相关推荐
独隅27 分钟前
Windows 10/11轻松解除磁盘写保护教程
windows
徒 花29 分钟前
Python知识学习07
windows·python·学习
跟着珅聪学java42 分钟前
在 Java 中处理 JSON 去除空 children数组,可以使用 Jackson 库。这里有几种实现方式
开发语言·windows·python
杨浦老苏1 小时前
轻量级RSS源处理中间件FeedCraft
人工智能·docker·ai·群晖·rss
Devin~Y1 小时前
大厂 Java 面试实战:从电商微服务到 AI 智能客服(含 Spring 全家桶、Redis、Kafka、RAG/Agent 解析)
java·spring boot·redis·elasticsearch·spring cloud·docker·kafka
AIBox3651 小时前
codex api 配置教程:安装、鉴权、Windows 环境变量
javascript·人工智能·windows·gpt
樽酒ﻬق1 小时前
构筑容器化基石:Docker 稳定版本抉择、极速安装与配置全解
java·docker·运维开发
网络安全许木1 小时前
自学渗透测试第八天(网络安全法、伦理规范与工具链联动)
windows·web安全·网络安全·渗透测试·kali linux
idolao1 小时前
微软常用运行库 安装教程:一键修复VC++运行环境(AIO合集)
windows
啦啦啦小石头3 小时前
Docker+Nvidia Container Toolkit 在ubuntu下离线安装
ubuntu·docker·eureka