WSL2 Ubuntu 20.04 Docker全流程配置指南:从安装到稳定运行

在开发者的日常工作中,Docker已经成为不可或缺的工具。而Windows用户通过WSL2运行Ubuntu并配置Docker,则是一种兼顾Windows便利性和Linux开发环境的理想方案。本文将带你从零开始,在WSL2的Ubuntu 20.04环境中完整配置Docker,并解决你可能遇到的各种问题。

1. 环境准备与安装方式选择

在开始之前,确保你的系统满足以下基本要求:

  • Windows 10版本2004或更高(建议使用Windows 11)
  • 已启用WSL2功能
  • 已安装Ubuntu 20.04发行版

安装方式对比

安装方式 优点 缺点 适用场景
在线安装 简单快捷,自动获取最新版本 需要稳定网络连接 常规开发环境
离线安装 不依赖网络,版本可控 需要手动下载包,更新麻烦 内网环境或无网络情况
脚本安装 全自动化,包含必要配置 需要信任第三方脚本 快速测试环境

对于大多数开发者,我们推荐使用在线安装方式:

# 更新软件包索引
sudo apt update

# 安装必要依赖
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common

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

# 添加Docker仓库
echo "deb [arch=amd64 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. 安装后基础验证

安装完成后,我们需要验证Docker是否正确安装并能正常运行:

# 检查Docker服务状态
sudo systemctl status docker

# 运行测试容器
sudo docker run hello-world

如果一切正常,你应该能看到"Hello from Docker!"的欢迎信息。如果没有,可能是以下原因:

  • Docker服务未启动: sudo service docker start
  • 权限问题:当前用户不在docker组
  • WSL2特有的网络或防火墙问题

3. 解决守护进程连接问题

在WSL2环境中,最常见的Docker问题是"Cannot connect to the Docker daemon"错误。这通常与iptables配置有关:

# 检查当前iptables版本
sudo update-alternatives --config iptables

你会看到类似输出:

Selection    Path                       Priority  Status
------------------------------------------------------------
* 0          /usr/sbin/iptables-nft     20       auto mode
1            /usr/sbin/iptables-legacy  10       manual mode
2            /usr/sbin/iptables-nft     20       manual mode

选择选项1切换到iptables-legacy模式,然后重启Docker服务:

sudo service docker restart

如果遇到"no alternatives for iptables"错误,先修复包依赖:

sudo apt --fix-broken install
sudo apt install iptables

4. 用户权限与系统配置

为了避免每次使用Docker都需要sudo,将当前用户加入docker组:

sudo usermod -aG docker $USER

注意:修改组设置后需要完全退出并重新登录WSL会话才能生效

常见权限问题解决方案

  1. 检查用户是否在docker组:

    groups
    
  2. 如果仍然遇到权限问题,尝试:

    sudo chmod 666 /var/run/docker.sock
    
  3. 对于持久化权限问题,可以创建别名:

    echo "alias docker='sudo docker'" >> ~/.bashrc
    source ~/.bashrc
    

5. WSL2与Windows防火墙交互

WSL2的网络架构可能导致Docker与Windows防火墙冲突。以下是解决方案:

方法一:允许Docker通过防火墙

  1. 打开Windows Defender防火墙
  2. 选择"允许应用或功能通过Windows Defender防火墙"
  3. 找到"Docker Desktop"并确保所有网络类型都被勾选

方法二:禁用WSL2的虚拟网络过滤 在Windows PowerShell中运行:

New-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\WinSock2\Parameters" -Name "AllowFiltersOnVirtualInterfaces" -Value 1 -PropertyType DWORD -Force

然后重启计算机。

6. 高级配置与优化

为了让Docker在WSL2中运行得更高效,可以进行以下优化:

内存与CPU限制 : 在 %USERPROFILE%\.wslconfig 文件中添加:

[wsl2]
memory=4GB
processors=2

Docker数据目录迁移 : 默认情况下,Docker数据存储在WSL2虚拟硬盘中,可以迁移到Windows分区:

# 停止Docker服务
sudo service docker stop

# 创建新的存储目录
sudo mkdir /mnt/wsl/docker-data

# 修改Docker配置
sudo sed -i 's|"data-root": "/var/lib/docker"|"data-root": "/mnt/wsl/docker-data"|' /etc/docker/daemon.json

# 启动Docker服务
sudo service docker start

7. 功能测试与验证

完成所有配置后,进行全面的功能测试:

  1. 基本容器测试

    docker run -it --rm ubuntu:20.04 bash
    
  2. 网络测试

    docker run --rm alpine ping -c 4 google.com
    
  3. 卷挂载测试

    docker run --rm -v ${PWD}:/data alpine ls /data
    
  4. 多容器通信测试

    docker network create test-net
    docker run -d --name web --network test-net nginx
    docker run --rm --network test-net curlimages/curl http://web
    

8. 日常使用技巧

性能优化

  • 将项目代码放在WSL2文件系统中( /home 目录下)而非Windows挂载目录( /mnt/c
  • 对于大型项目,考虑使用 .dockerignore 文件减少构建上下文

常用命令快捷方式

# 清理无用容器和镜像
alias docker-clean='docker rm $(docker ps -aq) 2>/dev/null; docker rmi $(docker images -q -f "dangling=true") 2>/dev/null'

# 快速进入容器
alias docker-bash='docker exec -it $(docker ps -lq) bash'

日志查看技巧

# 跟踪容器日志
docker logs -f container_name

# 查看Docker守护进程日志
journalctl -u docker.service -f

在实际项目中,我发现最常遇到的问题往往是网络配置和权限问题。保持WSL2和Docker版本的最新,可以避免很多兼容性问题。对于企业开发环境,建议使用固定版本的Docker以避免意外升级带来的问题。

更多推荐