WSL 与 Docker 容器化技术指南
一、WSL(Windows Subsystem for Linux)
1.1 定义与核心价值
WSL(Windows Subsystem for Linux) 是微软开发的 Windows 内置 Linux 兼容层,允许在 Windows 系统上直接运行 Linux 命令行工具和应用,无需虚拟机或双系统。
核心价值:
- 无缝集成:Linux 和 Windows 共享文件系统
- 性能优异:WSL 2 使用真正的 Linux 内核
- 开发友好:在 Windows 上享受 Linux 开发环境
- 资源高效:比虚拟机更节省内存和 CPU
1.2 WSL 版本对比
| 版本 | 架构 | 性能 | Docker 支持 | 推荐场景 |
|---|---|---|---|---|
| WSL 1 | 兼容性翻译层 | 较低 | 不支持 | 仅需运行简单命令行工具 |
| WSL 2 | 真正的 Linux 内核 | 接近原生 | 完全支持 | 开发环境、Docker、复杂应用 |
WSL 2 的关键改进:
- 使用 Hyper-V 虚拟化技术
- 原生 Linux 内核,支持完整的 Linux 系统调用
- 支持 Docker、Kubernetes 等容器化技术
- 更快的文件系统访问速度
1.3 安装步骤
方式一:一键安装(推荐)
powershell
# 以管理员身份运行 PowerShell
wsl --install
安装过程:
- 启用 Windows 虚拟机功能
- 下载并安装 Ubuntu 发行版
- 设置用户名和密码
方式二:手动安装
powershell
# 启用 WSL 功能
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 2
# 安装特定发行版
wsl --install -d Ubuntu-22.04
1.4 常用命令
基础操作
powershell
# 启动默认发行版
wsl
# 指定发行版
wsl -d Ubuntu-22.04
# 关闭所有 WSL 实例
wsl --shutdown
# 查看已安装发行版及状态
wsl -l -v
# 输出示例:
# NAME STATE VERSION
# * Ubuntu-22.04 Running 2
# Debian Stopped 2
版本管理
powershell
# 设置默认发行版
wsl --set-default Ubuntu-22.04
# 升级发行版
wsl --upgrade
# 卸载发行版
wsl --unregister Ubuntu-22.04
高级配置
powershell
# 导出发行版为 tar 文件
wsl --export Ubuntu-22.04 d:\backup\ubuntu.tar
# 导入发行版
wsl --import MyUbuntu d:\wsl\MyUbuntu d:\backup\ubuntu.tar
1.5 文件系统访问
Windows → Linux
bash
# Windows C 盘
/mnt/c/Users/用户名/
# Windows D 盘
/mnt/d/
# 示例:访问 Windows 桌面
cd /mnt/c/Users/用户名/Desktop
Linux → Windows
在文件资源管理器中输入:
\\wsl$\{发行版名称}\
示例:
\\wsl$\Ubuntu-22.04\home\{用户名}\
1.6 性能优化配置
创建 %UserProfile%\.wslconfig 文件:
ini
[wsl2]
memory=8GB # 限制内存使用
processors=4 # 限制 CPU 核心数
swap=4GB # 交换空间大小
swapFile=C:\wsl-swap.vhdx # 交换文件路径
localhostForwarding=true # 启用 localhost 转发
1.7 实用技巧
配置默认用户
bash
# 在 WSL 中执行
sudo nano /etc/wsl.conf
添加内容:
ini
[user]
default=你的用户名
启用 systemd
bash
sudo nano /etc/wsl.conf
添加内容:
ini
[boot]
systemd=true
重启 WSL:
powershell
wsl --shutdown
wsl
二、Docker 容器化技术
2.1 定义与核心价值
Docker 是一个开源的容器化平台,允许将应用及其依赖打包成标准化的"容器",在任何环境中一致运行。
核心价值:
- 环境一致性:开发、测试、生产环境完全一致
- 轻量高效:容器共享宿主机内核,启动速度快
- 易于部署:一键部署,无需复杂配置
- 弹性扩展:支持快速扩缩容
2.2 核心概念
| 概念 | 定义 | 类比 |
|---|---|---|
| 镜像(Image) | 打包好的应用模板,包含代码、依赖、配置 | 软件安装包 |
| 容器(Container) | 镜像的运行实例 | 运行中的软件 |
| Dockerfile | 定义如何构建镜像的文本文件 | 配方/说明书 |
| 仓库(Repository) | 存储和管理镜像的地方 | 软件仓库 |
2.3 安装步骤
步骤 1:安装 Docker Desktop
- 下载:Docker Desktop
- 运行安装程序
- 勾选 "Use WSL 2 instead of Hyper-V"
步骤 2:配置 WSL 2 后端
打开 Docker Desktop 设置:
- Settings → Resources → WSL Integration
- 启用与 WSL 发行版的集成
步骤 3:验证安装
bash
# 检查 Docker 版本
docker --version
# 输出:Docker version 26.0.0, build XXXXXXX
# 运行测试容器
docker run hello-world
# 输出:Hello from Docker! 表示安装成功
2.4 快速上手
基础命令
bash
# 拉取镜像(从 Docker Hub)
docker pull nginx:latest
# 运行容器
docker run -d -p 8080:80 --name my-nginx nginx
# -d: 后台运行
# -p 8080:80: 端口映射(主机:容器)
# --name: 容器名称
# 查看运行中的容器
docker ps
# 查看所有容器(包括已停止的)
docker ps -a
# 查看容器日志
docker logs my-nginx
# 进入容器内部
docker exec -it my-nginx bash
# 停止容器
docker stop my-nginx
# 删除容器
docker rm my-nginx
# 删除镜像
docker rmi nginx:latest
端口映射示例
bash
# 将主机 8080 端口映射到容器 80 端口
docker run -d -p 8080:80 nginx
# 将主机随机端口映射到容器 80 端口
docker run -d -P nginx
# 指定绑定地址
docker run -d -p 127.0.0.1:8080:80 nginx
数据卷挂载
bash
# 创建数据卷
docker volume create my-data
# 使用数据卷
docker run -d -v my-data:/app/data nginx
# 挂载本地目录
docker run -d -v /host/path:/container/path nginx
# 查看数据卷
docker volume ls
docker volume inspect my-data
2.5 Dockerfile 详解
Dockerfile 示例:
dockerfile
# 指定基础镜像
FROM python:3.10-slim
# 设置工作目录
WORKDIR /app
# 复制依赖文件
COPY requirements.txt .
# 安装依赖
RUN pip install --no-cache-dir -r requirements.txt
# 复制应用代码
COPY . .
# 设置环境变量
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0
# 暴露端口
EXPOSE 5000
# 启动命令
CMD ["flask", "run"]
常用指令:
| 指令 | 作用 | 示例 |
|---|---|---|
FROM |
指定基础镜像 | FROM python:3.10-slim |
WORKDIR |
设置工作目录 | WORKDIR /app |
COPY |
复制文件 | COPY . . |
ADD |
复制文件(支持 URL 和压缩) | ADD https://example.com/file.tar.gz . |
RUN |
执行命令 | RUN pip install -r requirements.txt |
ENV |
设置环境变量 | ENV PORT=5000 |
EXPOSE |
声明端口 | EXPOSE 5000 |
CMD |
容器启动命令 | CMD ["python", "app.py"] |
ENTRYPOINT |
入口点 | ENTRYPOINT ["python"] |
构建镜像:
bash
# 构建镜像(. 表示当前目录)
docker build -t my-app:1.0 .
# 指定 Dockerfile 路径
docker build -t my-app:1.0 -f Dockerfile.prod .
# 查看构建历史
docker history my-app:1.0
2.6 Docker Compose
定义:用于编排多个容器的工具,通过 YAML 文件定义服务、网络和数据卷
docker-compose.yml 示例:
yaml
version: '3.8'
services:
web:
build: .
ports:
- "8080:5000"
environment:
- FLASK_APP=app.py
- DATABASE_URL=postgresql://db:5432/myapp
depends_on:
- db
volumes:
- .:/app
db:
image: postgres:15
ports:
- "5432:5432"
environment:
- POSTGRES_DB=myapp
- POSTGRES_USER=admin
- POSTGRES_PASSWORD=password
volumes:
- postgres_data:/var/lib/postgresql/data
volumes:
postgres_data:
常用命令:
bash
# 启动服务(后台模式)
docker-compose up -d
# 启动服务(前台模式,查看日志)
docker-compose up
# 停止服务
docker-compose down
# 查看服务状态
docker-compose ps
# 查看日志
docker-compose logs web
# 执行命令
docker-compose exec web bash
# 构建并启动
docker-compose up --build
2.7 网络配置
Docker 网络类型
| 类型 | 特点 | 用途 |
|---|---|---|
| bridge | 默认网络,容器间可通信 | 单机多容器通信 |
| host | 共享宿主机网络 | 需要高性能网络 |
| none | 无网络连接 | 安全隔离场景 |
| overlay | 跨主机网络 | Swarm 集群 |
创建自定义网络
bash
# 创建自定义网络
docker network create my-network
# 运行容器并加入网络
docker run -d --network my-network --name container1 nginx
docker run -d --network my-network --name container2 redis
# 容器间可以通过名称通信
# 在 container1 中可以 ping container2
2.8 镜像管理
镜像标签
bash
# 为镜像添加标签
docker tag my-app:1.0 my-app:latest
# 推送镜像到仓库
docker push my-app:latest
# 从仓库拉取镜像
docker pull my-app:latest
镜像清理
bash
# 清理未使用的镜像
docker image prune
# 清理所有未使用的资源(镜像、容器、数据卷、网络)
docker system prune
# 清理未使用的数据卷
docker volume prune
2.9 Docker Hub 使用
登录与推送:
bash
# 登录 Docker Hub
docker login
# 构建镜像(需要包含用户名)
docker build -t username/my-app:1.0 .
# 推送镜像
docker push username/my-app:1.0
三、WSL 与 Docker 协同工作
3.1 架构关系
┌─────────────────────────────────────────┐
│ Windows 操作系统 │
├─────────────────────────────────────────┤
│ Hyper-V 虚拟化层 │
├─────────────────────────────────────────┤
│ ┌──────────┐ ┌──────────────────┐ │
│ │ WSL 2 │ │ Docker Engine │ │
│ │ (Linux) │ │ (在 WSL 中运行) │ │
│ └────┬─────┘ └────────┬─────────┘ │
│ │ │ │
│ └─────────┬─────────┘ │
│ │ │
│ ┌─────────▼─────────┐ │
│ │ 容器实例 │ │
│ │ (Nginx, Redis等) │ │
│ └───────────────────┘ │
└─────────────────────────────────────────┘
3.2 优势分析
| 维度 | WSL 1 + Docker | WSL 2 + Docker |
|---|---|---|
| 性能 | 较低 | 接近原生 |
| 文件系统 | 较慢 | 较快 |
| Docker 支持 | 不支持 | 完全支持 |
| Kubernetes | 不支持 | 支持 |
3.3 推荐安装顺序
1. 启用 Windows 功能(WSL、虚拟机平台)
↓
2. 安装 WSL 2(推荐 Ubuntu)
↓
3. 安装 Docker Desktop
↓
4. 配置 Docker Desktop 使用 WSL 2 后端
↓
5. 验证安装(docker run hello-world)
3.4 常见问题与解决方案
问题 1:Docker 无法启动
原因:WSL 2 未正确配置
解决方案:
powershell
# 检查 WSL 版本
wsl -l -v
# 如果版本为 1,升级到 2
wsl --set-version Ubuntu-22.04 2
# 重启 Docker Desktop
问题 2:容器无法访问主机服务
原因:网络配置问题
解决方案:
bash
# 在容器中使用 host.docker.internal 访问主机
curl http://host.docker.internal:8080
问题 3:WSL 内存占用过高
原因:默认配置未限制内存
解决方案 :
创建 %UserProfile%\.wslconfig:
ini
[wsl2]
memory=4GB
processors=2
问题 4:文件权限问题
原因:Windows 和 Linux 文件权限不同
解决方案:
bash
# 修改 WSL 配置
sudo nano /etc/wsl.conf
# 添加以下内容
[automount]
options = "metadata,umask=22,fmask=11"
四、实战示例:部署一个 Flask 应用
4.1 创建项目结构
my-flask-app/
├── app.py
├── requirements.txt
└── Dockerfile
4.2 编写应用代码
python
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return 'Hello from Docker + WSL!'
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
requirements.txt:
flask==2.3.3
4.3 编写 Dockerfile
dockerfile
FROM python:3.10-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 5000
CMD ["python", "app.py"]
4.4 构建并运行
bash
# 构建镜像
docker build -t my-flask-app .
# 运行容器
docker run -d -p 5000:5000 my-flask-app
# 访问应用
curl http://localhost:5000
# 输出:Hello from Docker + WSL!
五、总结
核心要点
- WSL 2 是首选:性能接近原生 Linux,完全支持 Docker
- Docker 容器化:实现环境一致性,简化部署流程
- 协同工作:WSL 提供 Linux 开发环境,Docker 提供容器运行时
- 开发效率:Windows 上享受 Linux 工具链,无需双系统
学习路径
基础命令 → Dockerfile → Docker Compose →
网络配置 → 数据管理 → 镜像优化 → Kubernetes
下一步建议
- 尝试使用 Docker Compose 部署多容器应用
- 学习 Dockerfile 最佳实践(分层构建、多阶段构建)
- 探索 Kubernetes 基础概念
- 了解 CI/CD 与 Docker 的集成