WSL + Docker 网络访问详解

概述

本文档详细说明Windows宿主机、WSL、Docker容器之间的网络访问流程,以及常见的坑点和解决方案。

安利一个claude code镜像站,注册即送200刀,每日签到25刀,每日还有抽奖。

网络架构图

复制代码
┌─────────────────────────────────────────────────────────────────┐
│                    Windows 宿主机                                │
│  ┌─────────────────┐    ┌─────────────────┐                      │
│  │   浏览器/应用    │    │   WSL2 子系统   │                      │
│  │                 │    │                 │                      │
│  │ localhost:9208  │    │ 172.27.157.134  │                      │
│  │ localhost:9209  │    │                 │                      │
│  └─────────────────┘    └─────────────────┘                      │
│         │                        │                                │
│         │                        │                                │
│         └────────┬─────────────────┘                                │
│                  │                                                │
│         ┌────────▼─────────────────┐                              │
│         │     WSL 虚拟网络         │                              │
│         │                         │                              │
│         │  ┌─────────────────────┐ │                              │
│         │  │   Docker 容器        │ │                              │
│         │  │                     │ │                              │
│         │  │ 容器IP: 172.17.x.x  │ │                              │
│         │  │ 端口: 9208          │ │                              │
│         │  └─────────────────────┘ │                              │
│         └─────────────────────────┘                              │
└─────────────────────────────────────────────────────────────────┘

网络访问流程详解

1. 浏览器访问WSL中Docker容器的完整路径

复制代码
浏览器 → Windows宿主机 → WSL → Docker容器

详细步骤:

  1. 浏览器发起请求

    复制代码
    用户输入: http://localhost:9209
  2. Windows宿主机接收

    复制代码
    Windows网络栈监听9209端口
    检查是否有进程占用该端口
  3. WSL端口映射转发

    复制代码
    WSL接收来自Windows的请求
    通过Docker端口映射转发到容器
  4. Docker容器处理

    复制代码
    容器内应用监听9208端口
    处理请求并返回响应
  5. 响应返回

    复制代码
    容器 → WSL → Windows → 浏览器

2. 端口映射机制

Docker端口映射语法
bash 复制代码
docker run -p 宿主机端口:容器端口
实际例子
bash 复制代码
# 将WSL的9209端口映射到容器的9208端口
docker run -p 9209:9208 hr-system-backend:latest

映射关系:

  • Windows宿主机:9209 ← → WSL:9209 ← → Docker容器:9208

常见坑点及解决方案

坑点1:端口冲突

问题描述
复制代码
docker: Error response from daemon: ports are not available: 
exposing port TCP 0.0.0.0:9208 -> 127.0.0.1:0: listen tcp 0.0.0.0:9208: 
bind: Only one usage of each socket address (protocol/network address/port) 
is normally permitted.
原因分析
  • Windows宿主机端口被占用
  • 本地开发服务与Docker容器端口冲突
  • 之前的容器没有完全清理
解决方案

1. 检查端口占用

bash 复制代码
# Windows PowerShell
netstat -ano | findstr :9208
netstat -ano | findstr :9209

# 查看占用进程
tasklist /FI "PID eq 进程ID"

2. 停止占用进程

bash 复制代码
# 强制停止进程
taskkill /PID 进程ID /F

3. 使用不同端口

bash 复制代码
# 修改Docker端口映射
docker run -p 9209:9208 hr-system-backend:latest

4. 清理旧容器

bash 复制代码
# 停止并删除旧容器
docker stop hr-backend
docker rm hr-backend

# 或者强制删除
docker rm -f hr-backend

坑点2:WSL网络配置问题

问题描述
  • WSL无法访问宿主机服务
  • 容器无法访问外部网络
  • 端口映射不生效
解决方案

1. 检查WSL网络状态

bash 复制代码
# 查看WSL IP地址
wsl hostname -I

# 检查WSL网络配置
wsl ip addr show

2. 重启WSL网络

bash 复制代码
# 在Windows PowerShell中
wsl --shutdown
wsl

3. 检查Docker网络

bash 复制代码
# 查看Docker网络
docker network ls
docker network inspect bridge

坑点3:防火墙和代理问题

问题描述
  • 浏览器无法访问localhost:9209
  • 请求超时
  • 连接被拒绝
解决方案

1. 检查Windows防火墙

bash 复制代码
# 临时关闭防火墙测试
netsh advfirewall set allprofiles state off

# 添加防火墙规则
netsh advfirewall firewall add rule name="WSL Docker" dir=in action=allow protocol=TCP localport=9209

2. 检查代理设置

bash 复制代码
# 检查系统代理
netsh winhttp show proxy

# 重置代理
netsh winhttp reset proxy

3. 检查WSL代理配置

bash 复制代码
# 在WSL中检查代理
echo $HTTP_PROXY
echo $HTTPS_PROXY

坑点4:Docker容器启动失败

问题描述
  • 容器创建成功但无法启动
  • 健康检查失败
  • 服务无法访问
解决方案

1. 检查容器日志

bash 复制代码
# 查看容器日志
docker logs hr-backend

# 实时查看日志
docker logs -f hr-backend

2. 检查容器状态

bash 复制代码
# 查看容器状态
docker ps -a

# 查看容器详细信息
docker inspect hr-backend

3. 进入容器调试

bash 复制代码
# 进入容器
docker exec -it hr-backend sh

# 检查容器内服务
netstat -tlnp
ps aux

最佳实践

1. 端口规划策略

复制代码
开发环境端口分配:
├── 本地开发后端: 9208
├── WSL Docker后端: 9209
├── 本地开发前端: 3000
├── WSL Docker前端: 3001
└── 生产环境: 9208

2. 部署脚本优化

bash 复制代码
#!/bin/bash

# 检查端口是否被占用
check_port() {
    local port=$1
    if netstat -ano | findstr ":$port" > /dev/null; then
        echo "[警告] 端口 $port 已被占用"
        return 1
    fi
    return 0
}

# 清理旧容器
cleanup_old_containers() {
    echo "清理旧容器..."
    docker stop hr-backend 2>/dev/null || true
    docker rm hr-backend 2>/dev/null || true
}

# 检查端口并部署
if check_port 9209; then
    cleanup_old_containers
    docker run -d --name hr-backend -p 9209:9208 hr-system-backend:latest
else
    echo "请先停止占用9209端口的服务"
    exit 1
fi

3. 网络诊断工具

bash 复制代码
# 创建网络诊断脚本
cat > network-diagnosis.sh << 'EOF'
#!/bin/bash

echo "=== WSL网络诊断 ==="
echo "WSL IP地址: $(hostname -I)"
echo "Docker网络:"
docker network ls
echo "容器状态:"
docker ps -a
echo "端口占用:"
netstat -tlnp | grep -E ":(9208|9209)"
echo "网络连通性测试:"
curl -I http://localhost:9209/health 2>/dev/null || echo "无法访问服务"
EOF

chmod +x network-diagnosis.sh

故障排查流程

1. 快速诊断步骤

bash 复制代码
# 1. 检查端口占用
netstat -ano | findstr ":9209"

# 2. 检查容器状态
docker ps -a | grep hr-backend

# 3. 检查容器日志
docker logs hr-backend

# 4. 测试网络连通性
curl -I http://localhost:9209/health

# 5. 检查WSL网络
wsl hostname -I

2. 常见错误及解决方案

错误信息 原因 解决方案
bind: address already in use 端口被占用 停止占用进程或使用不同端口
docker: Error response from daemon Docker服务问题 重启Docker服务
curl: (7) Failed to connect 网络连接问题 检查防火墙和代理设置
Container is not running 容器启动失败 检查容器日志和配置

3. 性能优化建议

bash 复制代码
# 1. 使用Docker网络优化
docker network create hr-network
docker run --network hr-network -p 9209:9208 hr-system-backend:latest

# 2. 配置资源限制
docker run -d \
  --name hr-backend \
  --memory=1g \
  --cpus=1 \
  -p 9209:9208 \
  hr-system-backend:latest

# 3. 使用健康检查
docker run -d \
  --name hr-backend \
  --health-cmd="curl -f http://localhost:9208/health || exit 1" \
  --health-interval=30s \
  -p 9209:9208 \
  hr-system-backend:latest

总结

WSL + Docker的网络访问虽然复杂,但理解了网络架构和常见坑点后,可以有效地进行故障排查和性能优化。关键是要理解端口映射机制和网络访问路径,这样才能快速定位和解决问题。


文档版本 : v1.0
适用环境: Windows 10/11 + WSL2 + Docker Desktop

相关推荐
黑黍11 小时前
如何在k8s中配置并使用nvidia显卡
云原生·容器·kubernetes
冷血~多好11 小时前
使用docker部署elk,实现日志追踪
elk·docker·容器
会飞的小蛮猪11 小时前
SkyWalking运维之路(Java探针接入)
java·运维·经验分享·容器·skywalking
不懂音乐的欣赏者12 小时前
Windows 下 ROS/ROS2 开发环境最优解:WSL 比直接安装、虚拟机、双系统更优雅!
linux·windows·ubuntu·ros·wsl·ros2·双系统
天一生水water12 小时前
docker-compose安装
运维·docker·容器
AuroraDPY13 小时前
计算机网络:基于TCP协议的自定义协议实现网络计算器功能
网络·tcp/ip·计算机网络
蓝象_13 小时前
docker安装配置mysql
mysql·docker·容器
张人玉13 小时前
TCP 的三次握手和四次挥手
网络·tcp/ip·c#
Cxzzzzzzzzzz13 小时前
Kubernetes 架构
容器·架构·kubernetes
一叶知秋yyds14 小时前
Centos 安装 Docker教程
linux·docker·centos