
这次我们来看在 Windows 上搭建 Docker 开发环境的第二部分。很多朋友在安装完 WSL 和 Docker Desktop 后发现容器网络不通、服务访问不了或者 WSL 子系统本身用起来不顺手这通常是因为基础设置没到位。这篇文章不讲概念直接解决三个核心问题如何对 WSL 虚拟机进行基础优化、如何高效安装常用软件以及如何正确配置防火墙规则让容器网络畅通无阻。如果你已经装好了 WSL 和 Docker Desktop但感觉环境“能用但不顺手”或者容器服务总在本地访问失败那么这篇文章的内容正是你需要的。我们会从 WSL 的包管理、镜像源、常用工具链安装讲起再到 Docker 容器与 Windows 宿主机的网络互通以及 Windows 防火墙的关键配置。目标是让你得到一个稳定、高效且网络透明的 Docker on WSL 开发环境。1. 核心能力速览本文解决什么问题在深入操作之前我们先明确本文能帮你达成的目标。这不是一个从零开始的安装教程而是针对“已安装但未优化”环境的深度设置指南。能力项说明与目标环境定位针对已安装 WSL 2 和 Docker Desktop 的 Windows 系统进行生产级优化。核心功能1.WSL 基础设置配置软件源、安装基础工具、优化 Shell 环境。2.软件生态安装涵盖开发、调试、运维常用工具链。3.网络与防火墙打通 WSL、Docker 容器与 Windows 宿主机的网络隔离解决访问不通问题。硬件门槛无特殊要求主要依赖已开启虚拟化的 CPU 和足够内存。WSL 2 本身对资源使用更高效。启动方式所有操作均在 PowerShell 或 WSL 终端中通过命令完成无需图形化复杂配置。适合场景Windows 下的 Docker 开发、Linux 环境学习、需要宿主机与容器网络互访的微服务调试、CI/CD 本地搭建。最终效果获得一个软件齐全、更新迅速、网络无阻的 Linux 子系统Docker 容器可被宿主机及其他设备无缝访问。2. 适用场景与使用边界2.1 谁需要做这些设置后端开发者在 Windows 上使用 Docker 运行 MySQL、Redis、Nginx 等服务需要从宿主机Windows用图形化工具如 Navicat, Another Redis Desktop Manager连接。全栈开发者前端项目在 Windows后端 API 在 Docker 容器中需要解决跨环境联调时的网络请求问题。运维与测试人员需要在本地搭建接近生产的环境进行服务编排和测试要求网络拓扑清晰。学生与学习者希望获得一个干净、高效的 Linux 学习环境避免频繁重装系统。2.2 使用边界与注意事项非从零安装指南本文假设你已成功安装 WSL 2 和 Docker Desktop。如果未安装请先参考官方文档完成第一步。防火墙风险提示调整防火墙规则会改变系统网络行为。本文提供的规则旨在放行开发流量请勿在生产服务器或对安全要求极高的个人主机上随意放行所有端口。网络配置差异不同的网络环境如公司内网、校园网、使用特定代理可能导致本文方案需要微调。请理解原理后灵活调整。WSL 发行版选择本文以 Ubuntu 为例但原理适用于任何 WSL 发行版如 Debian, CentOS Stream。命令可能因包管理器apt/yum/dnf而异。3. 环境准备与前置检查在开始优化之前请确保你的基础环境是就绪的。打开 PowerShell管理员身份执行以下检查命令。3.1 确认 WSL 与 Docker 状态# 1. 查看已安装的 WSL 发行版及其状态 wsl -l -v # 预期输出示例 # NAME STATE VERSION # * Ubuntu Running 2 # 如果 STATE 不是 Running使用 wsl -d Ubuntu 启动将 Ubuntu 替换为你的发行版名称。 # 确保 VERSION 为 2以获得更好的性能和完整的系统调用兼容性。 # 2. 检查 Docker Desktop 是否运行 docker --version # 应输出 Docker 版本号如 Docker version 24.0.7, build afdd53b # 3. 运行一个测试容器验证 Docker 引擎正常工作 docker run --rm hello-world # 如果成功会看到 “Hello from Docker!” 等信息。3.2 检查虚拟化与网络基础虚拟化已开启这通常在安装 WSL 2 时已解决。如果之前遇到过 “Virtualization is disabled” 错误需进入 BIOS/UEFI 设置开启 Intel VT-x 或 AMD-V。WSL 2 内核更新确保使用最新版 WSL 2 内核。可通过 Microsoft Store 中的 “Windows Subsystem for Linux Update” 或运行wsl --update来更新。防火墙默认状态了解当前防火墙是开启还是关闭。我们将在后续配置中与之协作而非简单关闭。4. WSL 虚拟机基础设置一个“开箱即用”的 WSL 镜像往往不是最佳状态。我们首先对其进行优化提升日常使用体验。4.1 更新系统与更换软件源启动你的 WSL 发行版例如 Ubuntu执行以下操作。国内用户强烈建议更换镜像源以加速下载。# 1. 备份原有的源列表 sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak # 2. 编辑源列表文件这里以 Ubuntu 22.04 为例使用清华源 # 你可以根据你的发行版和版本从镜像站官网获取对应的源内容。 sudo sed -i s//.*archive.ubuntu.com//mirrors.tuna.tsinghua.edu.cng /etc/apt/sources.list sudo sed -i s//.*security.ubuntu.com//mirrors.tuna.tsinghua.edu.cng /etc/apt/sources.list # 3. 更新软件包列表并升级所有已安装的包 sudo apt update sudo apt upgrade -y注意如果你使用 Debian、CentOS 等请替换为对应的镜像源如阿里云、中科大。这一步能极大缩短后续软件安装时间。4.2 安装基础工具链这些工具是开发、调试和系统管理的基础。# 安装常用工具包 sudo apt install -y \ curl wget git vim nano htop net-tools iputils-ping dnsutils \ # 网络与编辑工具 build-essential pkg-config autoconf libtool \ # 编译工具链 software-properties-common apt-transport-https ca-certificates gnupg lsb-release # 软件源管理4.3 配置 Shell 环境可选但推荐优化你的~/.bashrc或~/.zshrc让终端更好用。# 编辑 bashrc vim ~/.bashrc在文件末尾添加以下内容# 自定义别名 alias llls -alF alias lals -A alias lls -CF alias dpsdocker ps --format \table {{.ID}}\\t{{.Names}}\\t{{.Status}}\\t{{.Ports}}\ alias dcupdocker-compose up -d alias dcdowndocker-compose down # 设置更醒目的命令提示符 (PS1) export PS1\[\033[01;32m\]\u\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ # 使能颜色输出 export LS_COLORSrs0:di01;34:ln01;36:mh00:pi40;33:so01;35:do01;35:bd40;33;01:cd40;33;01:or40;31;01:mi00:su37;41:sg30;43:ca30;41:tw30;42:ow34;42:st37;44:ex01;32:*.tar01;31:*.tgz01;31:*.arc01;31:*.arj01;31:*.taz01;31:*.lha01;31:*.lz401;31:*.lzh01;31:*.lzma01;31:*.tlz01;31:*.txz01;31:*.tzo01;31:*.t7z01;31:*.zip01;31:*.z01;31:*.dz01;31:*.gz01;31:*.lrz01;31:*.lz01;31:*.lzo01;31:*.xz01;31:*.zst01;31:*.tzst01;31:*.bz201;31:*.bz01;31:*.tbz01;31:*.tbz201;31:*.tz01;31:*.deb01;31:*.rpm01;31:*.jar01;31:*.war01;31:*.ear01;31:*.sar01;31:*.rar01;31:*.alz01;31:*.ace01;31:*.zoo01;31:*.cpio01;31:*.7z01;31:*.rz01;31:*.cab01;31:*.wim01;31:*.swm01;31:*.dwm01;31:*.esd01;31:*.jpg01;35:*.jpeg01;35:*.mjpg01;35:*.mjpeg01;35:*.gif01;35:*.bmp01;35:*.pbm01;35:*.pgm01;35:*.ppm01;35:*.tga01;35:*.xbm01;35:*.xpm01;35:*.tif01;35:*.tiff01;35:*.png01;35:*.svg01;35:*.svgz01;35:*.mng01;35:*.pcx01;35:*.mov01;35:*.mpg01;35:*.mpeg01;35:*.m2v01;35:*.mkv01;35:*.webm01;35:*.ogm01;35:*.mp401;35:*.m4v01;35:*.mp4v01;35:*.vob01;35:*.qt01;35:*.nuv01;35:*.wmv01;35:*.asf01;35:*.rm01;35:*.rmvb01;35:*.flc01;35:*.avi01;35:*.fli01;35:*.flv01;35:*.gl01;35:*.dl01;35:*.xcf01;35:*.xwd01;35:*.yuv01;35:*.cgm01;35:*.emf01;35:*.ogv01;35:*.ogx01;35:*.aac00;36:*.au00;36:*.flac00;36:*.m4a00;36:*.mid00;36:*.midi00;36:*.mka00;36:*.mp300;36:*.mpc00;36:*.ogg00;36:*.ra00;36:*.wav00;36:*.oga00;36:*.opus00;36:*.spx00;36:*.xspf00;36:保存退出后执行source ~/.bashrc使配置立即生效。5. 软件安装打造全能开发环境基础系统设置好后我们来安装一些在开发、容器管理和日常使用中高频出现的软件。5.1 版本管理工具# 安装 Git如果未安装 sudo apt install -y git git --version # 安装并配置 Git 用户信息请替换成你自己的 git config --global user.name Your Name git config --global user.email your.emailexample.com git config --global core.editor vim5.2 容器与编排相关工具虽然 Docker Desktop 提供了核心引擎但一些 CLI 工具能让操作更便捷。# Docker Compose (Docker Desktop 通常已包含但可确保独立安装) sudo curl -L https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose sudo chmod x /usr/local/bin/docker-compose docker-compose --version # 可选Lazydocker - 终端下的 Docker 图形化管理工具 curl https://raw.githubusercontent.com/jesseduffield/lazydocker/master/scripts/install_update_linux.sh | bash5.3 网络诊断与开发工具# 网络诊断工具 sudo apt install -y netcat-openbsd traceroute mtr tcpdump # HTTP 测试工具 (curl 已安装可加装 httpie) sudo apt install -y httpie # 端口扫描工具 (nmap)用于检查端口开放情况 sudo apt install -y nmap5.4 编程语言环境按需安装# Node.js (通过 NodeSource 安装 LTS 版本) curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash - sudo apt install -y nodejs node --version npm --version # Python3 及 pip (通常已预装确保最新) sudo apt install -y python3 python3-pip python3-venv python3 --version pip3 --version # Java (OpenJDK 17) sudo apt install -y openjdk-17-jdk java -version6. 网络核心理解 WSL 2 与 Docker 的网络架构这是解决“访问不通”问题的关键。你必须理解数据流是如何走的。6.1 WSL 2 的网络模式WSL 2 采用虚拟化技术运行在一个轻量级 Hyper-V 虚拟机上。因此WSL 2 拥有独立的虚拟网络它有一个与 Windows 宿主机不同的 IP 地址段。出站连接Outbound从 WSL 内部访问外部互联网如curl baidu.com是通的因为 Windows 宿主机会为其做 NAT网络地址转换。入站连接Inbound从外部Windows 宿主机或其他局域网设备访问 WSL 内部的服务默认是受阻的。这是大多数问题的根源。6.2 Docker Desktop on WSL 2 的网络模式Docker Desktop 在 WSL 2 集成模式下Docker 守护进程和容器都运行在 WSL 2 的 Linux 内核中。容器网络Docker 容器默认创建在bridge网络如172.17.0.0/16上。端口映射当你使用-p 8080:80运行容器时Docker 会将容器的 80 端口映射到WSL 2 虚拟机的 8080 端口。关键点这个映射发生在 WSL 2 内部。要从 Windows 访问这个服务你需要能够访问到 WSL 2 虚拟机的 IP 和端口。6.3 当前网络拓扑[你的电脑 Windows Host] (IP: 192.168.1.100) | | (Hyper-V 虚拟交换机) | [WSL 2 虚拟机] (IP: 172.xx.xx.xx) -- Docker 守护进程在此运行 | | (Docker bridge) | [Docker 容器] (IP: 172.17.0.2) 运行着 Nginx (端口 80)当你执行docker run -p 8080:80 nginx后在 WSL 2 内部访问172.xx.xx.xx:8080或localhost:8080可以连通 Nginx。在 Windows 上访问localhost:8080通常也能通因为 Docker Desktop 和 Windows 做了特殊的localhost转发。但是如果你想从同一局域网下的另一台手机IP: 192.168.1.101访问你电脑上的这个 Nginx你需要访问192.168.1.100:8080。此时流量需要经过 Windows 防火墙并正确转发到 WSL 2再转发到 Docker 容器。默认情况下这一步会失败。7. 防火墙配置打通入站访问通道Windows Defender 防火墙是保护系统的重要组件我们不能简单关闭它。正确的做法是添加明确的入站规则放行特定的开发端口。7.1 确定需要放行的端口首先在 WSL 2 中查看 Docker 映射了哪些端口到 WSL 2 的 IP 上。# 在 WSL 2 终端中执行 # 查看 WSL 2 的 IP 地址 ip addr show eth0 | grep inet # 输出类似inet 172.27.112.186/20 brd 172.27.127.255 scope global eth0 # 记下这个 IP例如 172.27.112.186 # 查看当前运行的容器及其端口映射 docker ps --format table {{.Names}}\t{{.Ports}} # 输出示例 # NAMES PORTS # my-nginx 0.0.0.0:8080-80/tcp这个例子中容器的 80 端口被映射到了 WSL 2 的0.0.0.0:8080。这意味着 WSL 2 的 8080 端口正在监听。7.2 在 Windows 防火墙中添加入站规则我们需要允许外部流量访问 WSL 2 虚拟机的 IP 和端口。由于 WSL 2 的 IP 可能会变最稳妥的方法是允许访问WSL 2 的虚拟网卡。方法一使用 PowerShell 命令推荐精准控制以管理员身份打开 Windows PowerShell执行以下命令# 1. 创建一个新的入站规则允许 TCP 流量通过特定端口 # 将 8080 替换为你实际需要开放的端口号 New-NetFirewallRule -DisplayName WSL2 Docker Port 8080 -Direction Inbound -LocalPort 8080 -Protocol TCP -Action Allow # 2. 如果你需要开放一个端口范围例如 8000-9000 New-NetFirewallRule -DisplayName WSL2 Docker Ports 8000-9000 -Direction Inbound -LocalPort 8000-9000 -Protocol TCP -Action Allow # 3. 查看已创建的规则确认是否生效 Get-NetFirewallRule -DisplayName WSL2 Docker* | Format-Table DisplayName, Enabled, Direction, Action方法二通过高级安全 Windows Defender 防火墙图形界面在 Windows 搜索栏输入“高级安全 Windows Defender 防火墙”打开它。点击左侧“入站规则”然后右侧“新建规则...”。选择“端口”点击“下一步”。选择“TCP”并输入“特定本地端口”如8080或8000-9000点击“下一步”。选择“允许连接”点击“下一步”。何时应用规则全选域、专用、公用点击“下一步”。输入规则名称例如 “WSL2 Docker Port 8080”点击“完成”。7.3 验证防火墙规则是否生效在 Windows PowerShell 中使用Test-NetConnection或telnet来测试端口是否可被访问。# 首先在 WSL 2 中启动一个测试服务如果还没运行 # 在 WSL 2 终端里运行 # docker run -d -p 8080:80 --name test-nginx nginx # 然后在 Windows PowerShell 中测试 Test-NetConnection -ComputerName 127.0.0.1 -Port 8080 # 如果成功会显示 TcpTestSucceeded : True # 也可以测试从 Windows 宿主机的 IP 访问需要知道你的 Windows IP例如 192.168.1.100 Test-NetConnection -ComputerName 192.168.1.100 -Port 8080如果从本机 IP 测试失败但从127.0.0.1成功说明防火墙规则可能未正确应用或者规则作用域公用/专用网络不对。7.4 处理 WSL 2 IP 变化问题WSL 2 的 IP 在每次重启后可能会变。上述防火墙规则是基于端口而不是基于 IP所以通常不受影响。但如果你需要更稳定的方案例如固定 WSL 2 的 IP可以配置 WSL 2 使用静态 IP但这涉及修改.wslconfig和 Windows 路由表较为复杂。对于大多数开发场景基于端口的防火墙规则已足够。8. 功能测试与效果验证现在让我们通过一系列测试来验证环境是否完全畅通。8.1 测试 1基础容器访问宿主机 - 容器目的验证从 Windows 宿主机能否访问 WSL 2 内 Docker 容器暴露的服务。在 WSL 2 中启动测试容器docker run -d --rm -p 8080:80 --name web-test nginx:alpine在 WSL 2 内部验证curl http://localhost:8080 # 应返回 Nginx 欢迎页面的 HTML 代码。在 Windows 中验证打开浏览器访问http://localhost:8080。或在 PowerShell 中执行curl http://localhost:8080如果已安装 curl。预期结果成功看到 Nginx 欢迎页面。8.2 测试 2跨设备访问手机/其他电脑 - 你的电脑目的验证局域网内其他设备能否访问你电脑上 Docker 容器运行的服务。确保测试设备与你的电脑在同一局域网。在测试设备上打开浏览器。输入http://你的电脑Windows IP:8080。例如http://192.168.1.100:8080。预期结果成功看到 Nginx 欢迎页面。说明防火墙规则生效网络通路完整。失败页面无法打开或超时。需要按以下步骤排查。8.3 测试 3WSL 2 内部服务访问容器 - 容器或 主机 - WSL 2 非容器服务目的验证 WSL 2 内部网络非 Docker 网络的互通性。在 WSL 2 中启动一个简单的 Python HTTP 服务不使用 Dockerpython3 -m http.server 8888 从 Windows 访问此服务浏览器访问http://localhost:8888。注意对于 WSL 2 内非 Docker 的服务Docker Desktop 的localhost转发可能不生效。此时你需要使用 WSL 2 的 IP 进行访问。获取 WSL 2 IPhostname -I。在 Windows 浏览器访问http://WSL2_IP:8888。预期结果能看到 Python 服务列出的文件目录。如果失败同样需要检查防火墙是否放行了 8888 端口。9. 常见问题与排查方法即使按照步骤操作也可能遇到问题。下表列出了常见现象及其解决方法。问题现象可能原因排查方式解决方案Windows 访问localhost:8080失败1. Docker Desktop 服务未运行。2. 容器未成功启动或端口映射错误。3. Windows 与 WSL 2 的localhost转发异常。1. 检查 Docker Desktop 托盘图标是否正常。2. 在 WSL 2 中运行docker ps查看容器状态和端口映射。3. 在 WSL 2 中运行curl localhost:8080测试。1. 重启 Docker Desktop。2. 检查docker run -p参数是否正确。3. 尝试在 Windows 中访问http://WSL2_IP:8080。局域网设备访问Windows_IP:8080失败1. Windows 防火墙阻止入站连接。2. 路由器或网络策略阻止。3. Windows 网络配置文件为“公用”。1. 在 PowerShell 用Test-NetConnection -ComputerName 127.0.0.1 -Port 8080测试本地。2. 用Test-NetConnection -ComputerName Windows_IP -Port 8080从本机测本机IP。3. 检查防火墙规则是否启用且作用域正确。1. 按本文第 7.2 节添加入站规则。2. 将网络配置文件从“公用”更改为“专用”在 Windows 网络设置中。3. 暂时关闭防火墙测试仅用于排查完成后请重新打开并配置规则。WSL 2 IP 无法 ping 通WSL 2 虚拟网络适配器状态异常。在 Windows PowerShell 中运行ipconfig查看是否有vEthernet (WSL)适配器及其 IP。1. 在 PowerShell 中执行wsl --shutdown彻底关闭 WSL然后重启。2. 重置网络netsh winsock reset(管理员权限)重启电脑。Docker 容器无法访问外部网络WSL 2 内部的 DNS 或网络配置问题。在容器内执行ping 8.8.8.8和ping baidu.com。1. 检查 WSL 2 的/etc/resolv.conf确保 DNS 服务器正确。2. 在 Docker Desktop 设置中尝试重置 Kubernetes 或恢复出厂设置。端口冲突无法绑定该端口已被其他进程占用。在 WSL 2 中运行sudo netstat -tulpn | grep :8080查看占用进程。1. 停止占用端口的进程。2. 为 Docker 容器映射另一个端口如-p 8081:80。WSL 2 启动慢或卡住虚拟化资源分配或系统休眠问题。观察wsl -l -v输出状态。1. 创建或修改C:\Users\你的用户名\.wslconfig文件限制内存和CPU。2. 避免将 WSL 文件放在机械硬盘或网络驱动器。10. 最佳实践与使用建议完成所有配置后遵循以下建议可以让你的 Docker on WSL 2 环境更稳定、高效。端口规划为不同的开发项目规划不同的端口范围并在防火墙中成组放行。例如Web 前端用3000-3999后端 API 用8000-8999数据库用3306, 5432, 6379等。使用 Docker Compose对于多容器应用始终使用docker-compose.yml来定义服务、网络和卷。这便于版本控制和一键启停。项目目录放在 WSL 2 文件系统内虽然可以从/mnt/c/访问 Windows 文件但将项目代码放在 WSL 2 的原生文件系统如~/projects/内性能会好得多也能避免文件权限问题。定期更新定期运行sudo apt update sudo apt upgrade以及更新 Docker Desktop 和 WSL 2 内核以获得安全补丁和性能改进。备份.wslconfig如果你创建了自定义的.wslconfig文件来分配内存或处理器请备份它。重装系统或 WSL 后可以快速恢复。善用docker system prune定期清理无用的 Docker 镜像、容器和卷释放磁盘空间。可以添加-a和--volumes标志进行深度清理谨慎使用。网络问题优先排查防火墙当遇到任何“能本地访问不能远程访问”的问题时首先怀疑 Windows 防火墙并按照本文第 7 节的方法进行验证和规则添加。通过以上步骤你不仅解决了 WSL 2 和 Docker 的基础使用问题更构建了一个网络透明、工具齐全、易于维护的本地开发环境。这套环境能让你像在 Linux 服务器上一样自如地使用 Docker同时享受 Windows 宿主机的便利。下次当你需要部署一个复杂的微服务栈进行本地调试时这些关于网络和防火墙的知识将至关重要。