Win10 WSL2内Docker Superset容器无法访问宿主机PostgreSQL端口
问题描述
WSL2 Ubuntu中部署的Docker版Superset无法访问Win10宿主机上的PostgreSQL服务(地址172.17.192.1,端口5433),报错提示"The port is closed"。但WSL2系统本身可正常连通该PostgreSQL服务,且PostgreSQL已配置开放监听地址并添加了WSL地址的访问权限。
已完成的部署及配置步骤
Docker版Superset部署步骤
- 拉取Superset镜像
sudo docker pull apache/superset - 启动Superset容器
sudo docker run -d -p 8080:8088 -e "SUPERSET_SECRET_KEY=your_secret_key_here" --name superset apache/superset - 初始化Superset
sudo docker exec -it superset superset fab create-admin \ --username admin \ --firstname Superset \ --lastname Admin \ --email admin@admin.com \ --password postgres123; \ sudo docker exec -it superset superset db upgrade; \ sudo docker exec -it superset superset load_examples; \ sudo docker exec -it superset superset init; - Win10宿主机可通过以下地址正常登录Superset:
http://localhost:8080/login
环境信息
Win10宿主机WSL网卡信息
Adapter Ethernet vEthernet (WSL): IPv4-adress. . . . . . . . . . . . : 172.17.192.1 Subnet mask . . . . . . . . . . : 255.255.240.0
5433端口已在宿主机开放。
WSL2 Ubuntu内连通测试(可正常访问)
slubun@msknb51:~$ route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 172.17.192.1 0.0.0.0 UG 0 0 0 eth0 172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0 172.17.192.0 0.0.0.0 255.255.240.0 U 0 0 0 eth0 slubun@msknb51:~$ ifconfig docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255 eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 172.17.194.48 netmask 255.255.240.0 broadcast 172.17.207.255 slubun@msknb51:~$ telnet 172.17.192.1 5433 Trying 172.17.192.1... Connected to 172.17.192.1. Escape character is '^]'.
PostgreSQL配置
postgresql.conf
listen_addresses = '*' # what IP address(es) to listen on; port = 5433 # (change requires restart)
pg_hba.conf
host all all 172.17.194.48/20 trust
解决方案
问题根源在于Docker容器默认使用docker0网桥(网段172.17.0.0/16),而当前pg_hba.conf仅允许WSL2的eth0地址段(172.17.194.48/20)访问,容器IP不在该授权范围内。可通过以下三种方式解决:
方式一:修改PostgreSQL的pg_hba.conf,允许Docker网桥网段访问
- 打开Win10宿主机上的pg_hba.conf文件,添加以下规则:
host all all 172.17.0.0/16 trust - 重启PostgreSQL服务使配置生效。
- 在Superset容器中测试连通性:
sudo docker exec -it superset telnet 172.17.192.1 5433
方式二:使用WSL2的host.docker.internal地址访问宿主机
Docker在WSL2环境中提供了host.docker.internal域名,可直接映射到Win10宿主机地址。
- 在Superset中配置PostgreSQL数据源时,将主机地址改为
host.docker.internal,端口保持5433。 - 确保pg_hba.conf允许该域名对应的IP段访问(可暂时添加
host all all 0.0.0.0/0 trust测试,完成后再收紧权限)。
方式三:将Superset容器加入WSL2的主机网络
启动容器时使用--network host参数,让容器直接使用WSL2的网络栈,使容器IP与WSL2 eth0地址在同一网段:
- 先停止并删除现有Superset容器:
sudo docker stop superset sudo docker rm superset - 重新启动容器:
sudo docker run -d --network host -e "SUPERSET_SECRET_KEY=your_secret_key_here" --name superset apache/superset - 再次执行初始化步骤(若需要),然后测试容器访问PostgreSQL:
sudo docker exec -it superset telnet 172.17.192.1 5433
内容的提问来源于stack exchange,提问作者Вячеслав Бекетов
相关产品推荐
相关产品推荐

