WSL2 Ubuntu 20.04 Docker全流程配置指南:从安装到生产级优化

在开发者的日常工作中,Docker已经成为不可或缺的工具。而Windows用户通过WSL2运行Ubuntu 20.04来使用Docker,既能享受Linux环境的便利,又能保持Windows系统的友好界面。本文将带你从零开始,在WSL2的Ubuntu 20.04上完成Docker的完整配置流程,包括环境准备、安装选择、常见问题预防和后期优化,确保你获得与原生Linux几乎无差别的Docker使用体验。

1. 环境准备与系统配置

在开始安装Docker之前,确保你的WSL2和Ubuntu 20.04环境已经正确设置并更新到最新状态。这一步至关重要,可以避免后续许多潜在问题。

首先,确认你的Windows系统已经启用WSL2功能。在PowerShell中运行:

wsl --list --verbose

输出应显示你的Ubuntu 20.04发行版,并且VERSION列为2。如果不是,你需要先升级到WSL2:

wsl --set-version Ubuntu-20.04 2

接下来,在Ubuntu 20.04中更新系统包:

sudo apt update && sudo apt upgrade -y

系统更新完成后,安装一些基础依赖包:

sudo apt install -y apt-transport-https ca-certificates curl software-properties-common

这些包将为后续Docker安装提供必要的支持。特别需要注意的是,WSL2与完整Linux系统在服务管理上有一些差异,这会影响Docker的运行方式。

提示:WSL2的内存管理有时会导致系统资源不足。如果遇到性能问题,可以在Windows用户目录下的 .wslconfig 文件中添加以下内容来调整资源分配:

[wsl2]
memory=4GB
processors=2

2. Docker安装方案选择与实施

在WSL2的Ubuntu 20.04上安装Docker有多种方法,每种方法各有优缺点。我们将详细比较这些方法,并推荐最适合WSL2环境的安装流程。

2.1 官方仓库安装(推荐)

这是最常用且维护最方便的安装方式:

# 添加Docker官方GPG密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

# 设置稳定版仓库
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 安装Docker引擎
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io

这种方法的优势在于:

  • 自动获取最新稳定版本
  • 便于后续更新维护
  • 官方支持保障

2.2 离线包安装(特殊场景备用)

在某些无法连接互联网的环境中,可以使用离线包安装方式:

  1. 从另一台机器下载所需deb包:

    wget https://download.docker.com/linux/ubuntu/dists/focal/pool/stable/amd64/docker-ce_20.10.12~3-0~ubuntu-focal_amd64.deb
    wget https://download.docker.com/linux/ubuntu/dists/focal/pool/stable/amd64/docker-ce-cli_20.10.12~3-0~ubuntu-focal_amd64.deb
    wget https://download.docker.com/linux/ubuntu/dists/focal/pool/stable/amd64/containerd.io_1.4.12-1_amd64.deb
    
  2. 将包复制到目标机器后安装:

    sudo dpkg -i docker-ce*.deb containerd.io*.deb
    

离线安装的缺点是版本固定,后续更新麻烦,仅推荐在特殊网络环境下使用。

2.3 安装后必须的iptables配置

无论采用哪种安装方式,在WSL2中安装Docker后必须立即执行以下操作,这是预防"无法连接Docker守护进程"问题的关键:

sudo update-alternatives --config iptables

在出现的菜单中选择 1 (iptables-legacy),然后重启Docker服务:

sudo service docker restart

如果遇到 no alternatives for iptables 错误,先修复系统包:

sudo apt --fix-broken install

注意:这一步不是可选的,而是WSL2环境下Docker正常工作的必要条件。许多教程将其作为问题解决方案,但实际上应该作为安装流程的标准步骤。

3. 安装验证与基础配置

安装完成后,我们需要验证Docker是否正常工作,并进行一些基础配置以提升使用体验。

3.1 基本功能验证

运行经典的hello-world容器来测试Docker基本功能:

sudo docker run hello-world

如果看到欢迎信息,说明Docker已正确安装。接下来测试更复杂的功能:

# 运行一个交互式Ubuntu容器
sudo docker run -it ubuntu bash

# 在容器内执行简单命令
ls -l
exit

3.2 用户组配置(避免频繁使用sudo)

默认情况下,运行Docker命令需要sudo权限。将当前用户加入docker组可以避免每次都要输入sudo:

sudo usermod -aG docker $USER

然后退出终端重新登录使更改生效。验证是否生效:

docker run hello-world

如果仍然需要sudo,可能需要重启WSL实例:

wsl --terminate Ubuntu-20.04

3.3 服务自启动配置

由于WSL2的特殊性,Docker服务不会自动启动。我们有几种解决方案:

方案1:每次启动时手动运行(最简单)

sudo service docker start

方案2:添加到shell配置文件(推荐) ~/.bashrc ~/.zshrc 末尾添加:

# 启动Docker服务
if [ -z "$(ps aux | grep dockerd | grep -v grep)" ]; then
    sudo service docker start >/dev/null 2>&1
fi

方案3:Windows任务计划(最自动化)

  1. 创建 start_docker.sh 脚本:
    #!/bin/bash
    sudo service docker start
    
  2. 在Windows任务计划中设置登录时运行该脚本

4. 高级配置与性能优化

为了让Docker在WSL2中发挥最佳性能,我们需要进行一些高级配置。

4.1 存储驱动优化

WSL2默认的Docker存储驱动可能不是最优选择。检查当前存储驱动:

docker info | grep "Storage Driver"

如果显示 overlay2 ,则已经是最佳配置。如果是其他驱动,可以修改配置:

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<EOF
{
  "storage-driver": "overlay2"
}
EOF
sudo service docker restart

4.2 镜像与数据存储位置

WSL2的磁盘性能受虚拟化影响,将Docker数据存储在WSL2发行版内部通常比挂载Windows目录更快:

docker info | grep "Docker Root Dir"

确保输出路径以 /var/lib/docker 开头,表示数据存储在WSL2内部。

4.3 资源限制调整

默认情况下,Docker可以使用WSL2分配的所有资源。如果需要限制,可以创建或修改 /etc/docker/daemon.json

{
  "default-ulimits": {
    "nofile": {
      "Name": "nofile",
      "Hard": 65535,
      "Soft": 65535
    }
  },
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  }
}

重启Docker使更改生效:

sudo service docker restart

4.4 网络性能优化

WSL2的网络性能有时会成为瓶颈。可以尝试以下优化:

  1. 禁用IPv6(如果不需要):

    sudo sysctl -w net.ipv6.conf.all.disable_ipv6=1
    sudo sysctl -w net.ipv6.conf.default.disable_ipv6=1
    
  2. 调整TCP缓冲区大小:

    sudo sysctl -w net.core.rmem_max=4194304
    sudo sysctl -w net.core.wmem_max=4194304
    

这些优化可以显著提升容器网络性能,特别是在大量数据传输场景下。

5. 常见问题排查与解决

即使按照最佳实践配置,仍可能遇到一些问题。以下是WSL2中Docker常见问题的解决方法。

5.1 Docker服务无法启动

如果遇到 Cannot connect to the Docker daemon 错误,按以下步骤排查:

  1. 确认Docker服务正在运行:

    sudo service docker status
    
  2. 如果没有运行,尝试启动:

    sudo service docker start
    
  3. 检查日志获取详细信息:

    journalctl -u docker.service -b
    

5.2 容器网络连接问题

WSL2的NAT网络可能导致容器网络异常。解决方法:

  1. 重置Docker网络:

    sudo systemctl reset-failed docker.service
    sudo systemctl restart docker
    
  2. 检查防火墙设置:

    Get-NetFirewallProfile | Select-Object Name, Enabled
    

    必要时在Windows防火墙中添加例外规则。

5.3 磁盘空间不足

WSL2虚拟硬盘空间会不断增长但不会自动回收。手动清理:

  1. 在Windows中列出WSL发行版:

    wsl --list --verbose
    
  2. 导出重要数据后关闭发行版:

    wsl --terminate Ubuntu-20.04
    
  3. 压缩虚拟硬盘:

    diskpart
    select vdisk file="%USERPROFILE%\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu20.04onWindows_79rhkp1fndgsc\LocalState\ext4.vhdx"
    compact vdisk
    exit
    

5.4 性能监控与调优

监控WSL2中Docker的资源使用情况:

# 查看容器资源使用
docker stats

# 查看系统资源
top
htop

如果发现性能问题,可以调整WSL2资源配置。创建或修改 %USERPROFILE%\.wslconfig

[wsl2]
memory=6GB
processors=4
swap=2GB

这些配置需要重启WSL2生效:

wsl --shutdown

更多推荐