WSL 与 Docker 集成
WSL 2 与 Docker Desktop 集成配置和最佳实践
📋 目录
Docker Desktop 安装
系统要求
- Windows 10:64-bit,版本 1903 或更高(内部版本 18362 或更高)
- Windows 11:64-bit,所有版本
- WSL 2:必须启用 WSL 2 功能
- 虚拟化:必须在 BIOS 中启用虚拟化
安装步骤
1. 启用 WSL 2
# 以管理员身份运行 PowerShell
# 启用 WSL
wsl --install
# 或手动启用
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
# 重启计算机
Restart-Computer
# 设置 WSL 2 为默认版本
wsl --set-default-version 22. 下载并安装 Docker Desktop
- 访问 Docker Desktop 下载页面
- 下载 Docker Desktop for Windows
- 运行安装程序
- 按照向导完成安装
- 重启计算机(如需要)
3. 配置 Docker Desktop
- 启动 Docker Desktop
- 进入 Settings → General
- 启用 “Use the WSL 2 based engine”
- 在 Settings → Resources → WSL Integration 中:
- 启用 “Enable integration with my default WSL distro”
- 选择要集成的 WSL 发行版
验证安装
# 在 WSL 中验证 Docker
docker --version
docker compose version
# 测试 Docker
docker run hello-world
# 查看 Docker 信息
docker infoWSL 2 后端配置
Docker Desktop 设置
General 设置
- ✅ Use the WSL 2 based engine:必须启用
- ✅ Start Docker Desktop when you log in:可选
- ✅ Use Docker Compose V2:推荐启用
Resources 设置
- WSL Integration:
- ✅ Enable integration with my default WSL distro
- 选择要集成的发行版(如 Ubuntu-22.04)
Docker Engine 设置
可以配置 Docker daemon 选项:
{
"builder": {
"gc": {
"defaultKeepStorage": "20GB",
"enabled": true
}
},
"experimental": false,
"features": {
"buildkit": true
}
}WSL 配置
确保 .wslconfig 配置合理:
[wsl2]
# 分配足够的内存
memory=8GB
# 分配足够的 CPU 核心
processors=4
# 交换空间
swap=2GB
# 本地主机转发(重要)
localhostForwarding=true验证集成
# 在 WSL 中检查 Docker 上下文
docker context ls
# 应该显示 "default" 或 "desktop-linux"
# 检查 Docker 是否运行
docker ps
# 如果出现错误,检查 Docker Desktop 是否运行Docker 命令使用
基本命令
# 查看 Docker 版本
docker --version
docker compose version
# 查看 Docker 信息
docker info
# 查看运行中的容器
docker ps
# 查看所有容器
docker ps -a
# 查看镜像
docker images
# 拉取镜像
docker pull ubuntu:22.04
docker pull node:18-alpine
# 运行容器
docker run -it ubuntu:22.04 /bin/bash
docker run -d -p 3000:3000 node:18-alpine
# 停止容器
docker stop container_id
# 删除容器
docker rm container_id
# 删除镜像
docker rmi image_idDocker Compose
# 使用 Docker Compose
docker compose up -d
docker compose down
docker compose ps
docker compose logs在 WSL 中使用 Docker
所有 Docker 命令都可以直接在 WSL 中运行:
# 构建镜像
docker build -t myapp:latest .
# 运行容器
docker run -d \
--name myapp \
-p 3000:3000 \
-v $(pwd):/app \
myapp:latest
# 查看日志
docker logs myapp
# 进入容器
docker exec -it myapp /bin/bash容器网络配置
网络模式
Docker Desktop 在 WSL 2 中支持以下网络模式:
- bridge:默认网络模式
- host:使用主机网络(在 WSL 2 中有限支持)
- none:无网络
端口映射
# 映射端口
docker run -d -p 3000:3000 nginx
# 映射多个端口
docker run -d -p 3000:3000 -p 8080:80 nginx
# 指定主机 IP
docker run -d -p 127.0.0.1:3000:3000 nginx从 Windows 访问容器
由于 WSL 2 使用虚拟网络,需要配置端口转发:
# Docker Desktop 通常会自动处理端口转发
# 如果无法访问,检查 Windows 防火墙规则
# 手动测试端口
Test-NetConnection -ComputerName localhost -Port 3000容器间通信
# 创建网络
docker network create mynetwork
# 在指定网络中运行容器
docker run -d --name app1 --network mynetwork myapp:latest
docker run -d --name app2 --network mynetwork myapp:latest
# 容器可以通过名称互相访问
# 例如:curl http://app1:3000Docker Compose 网络
version: '3.8'
services:
app:
build: .
ports:
- "3000:3000"
networks:
- mynetwork
db:
image: postgres:15
environment:
POSTGRES_DB: mydb
POSTGRES_USER: user
POSTGRES_PASSWORD: password
networks:
- mynetwork
networks:
mynetwork:
driver: bridge性能优化
文件系统性能
推荐:使用 Linux 文件系统
# 推荐:项目文件在 Linux 文件系统中
~/projects/myapp
# 不推荐:项目文件在 Windows 文件系统中
/mnt/c/Users/Username/projects/myapp原因:
- WSL 2 中 Linux 文件系统(ext4)性能更好
- Windows 文件系统(NTFS)通过 9p 协议访问,性能较差
- 避免文件权限问题
使用命名卷
# 创建命名卷
docker volume create mydata
# 使用命名卷
docker run -d -v mydata:/data myapp:latest资源限制
在 .wslconfig 中配置:
[wsl2]
# 分配足够的内存给 WSL(Docker 需要)
memory=8GB
# 分配足够的 CPU 核心
processors=4
# 交换空间
swap=2GB在 Docker Desktop 中配置:
- Settings → Resources
- 调整 CPU、内存、磁盘限制
BuildKit
启用 BuildKit 以提升构建性能:
# 设置环境变量
export DOCKER_BUILDKIT=1
export COMPOSE_DOCKER_CLI_BUILD=1
# 或在 Docker Desktop 中启用
# Settings → Docker Engine → 添加:
{
"features": {
"buildkit": true
}
}镜像优化
# 使用多阶段构建
FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
FROM node:18-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
COPY package*.json ./
CMD ["node", "dist/index.js"]常见问题
1. Docker 命令未找到
问题:docker: command not found
解决方案:
- 确保 Docker Desktop 正在运行
- 在 Docker Desktop Settings → Resources → WSL Integration 中启用集成
- 重启 WSL:
wsl --shutdown然后重新启动
2. 无法连接到 Docker daemon
问题:Cannot connect to the Docker daemon
解决方案:
# 检查 Docker Desktop 是否运行
# 在 Windows 任务栏查看 Docker 图标
# 重启 Docker Desktop
# 或在 WSL 中重启
wsl --shutdown
wsl3. 端口无法访问
问题:容器运行但无法从 Windows 访问
解决方案:
- 检查端口映射:
docker ps查看端口映射 - 检查 Windows 防火墙规则
- 检查
.wslconfig中的localhostForwarding=true - 尝试使用
127.0.0.1而不是localhost
4. 文件权限问题
问题:容器中文件权限不正确
解决方案:
# 使用命名卷而不是绑定挂载
docker volume create mydata
# 或在 docker-compose.yml 中
volumes:
- mydata:/app/data5. 性能问题
问题:Docker 操作缓慢
解决方案:
- 确保使用 WSL 2:
wsl --list --verbose - 将项目文件放在 Linux 文件系统中
- 增加 WSL 资源分配(内存、CPU)
- 启用 BuildKit
6. 磁盘空间不足
问题:Docker 镜像和容器占用大量空间
解决方案:
# 清理未使用的资源
docker system prune -a
# 清理特定资源
docker image prune -a
docker container prune
docker volume prune
# 查看磁盘使用
docker system df7. 网络问题
问题:容器无法访问外部网络
解决方案:
# 检查 Docker 网络
docker network ls
# 检查容器网络配置
docker inspect container_name | grep NetworkMode
# 重启 Docker Desktop最佳实践
1. 项目结构
project/
├── Dockerfile
├── docker-compose.yml
├── .dockerignore
└── src/
2. .dockerignore
node_modules
npm-debug.log
.git
.gitignore
.env
*.md
3. 使用 Docker Compose
对于多容器应用,使用 Docker Compose:
version: '3.8'
services:
app:
build: .
ports:
- "3000:3000"
volumes:
- ./src:/app/src
environment:
- NODE_ENV=development
depends_on:
- db
db:
image: postgres:15
environment:
POSTGRES_DB: mydb
POSTGRES_USER: user
POSTGRES_PASSWORD: password
volumes:
- postgres_data:/var/lib/postgresql/data
volumes:
postgres_data:4. 开发环境配置
# docker-compose.dev.yml
version: '3.8'
services:
app:
build:
context: .
target: development
volumes:
- ./src:/app/src
- /app/node_modules
environment:
- NODE_ENV=development