WSL与Docker容器化技术指南

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

安装过程

  1. 启用 Windows 虚拟机功能
  2. 下载并安装 Ubuntu 发行版
  3. 设置用户名和密码
方式二:手动安装
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
  1. 下载:Docker Desktop
  2. 运行安装程序
  3. 勾选 "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 编写应用代码

app.py

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!

五、总结

核心要点

  1. WSL 2 是首选:性能接近原生 Linux,完全支持 Docker
  2. Docker 容器化:实现环境一致性,简化部署流程
  3. 协同工作:WSL 提供 Linux 开发环境,Docker 提供容器运行时
  4. 开发效率:Windows 上享受 Linux 工具链,无需双系统

学习路径

复制代码
基础命令 → Dockerfile → Docker Compose → 
网络配置 → 数据管理 → 镜像优化 → Kubernetes

下一步建议

  1. 尝试使用 Docker Compose 部署多容器应用
  2. 学习 Dockerfile 最佳实践(分层构建、多阶段构建)
  3. 探索 Kubernetes 基础概念
  4. 了解 CI/CD 与 Docker 的集成