📖 教程概述
本指南提供了一个完整的WSL2环境下Docker部署方案,专门解决数据目录自定义和用户权限配置的需求。
🎯 解决的问题
- Docker默认数据目录空间不足
- WSL2环境下的文件系统兼容性问题
- 每次使用Docker都需要sudo的权限问题
- WSL2重启后Docker服务需要手动启动
- 缺乏有效的Docker管理和监控工具
💡 教程特点
🔧 实用性强 - 专门针对WSL2环境的Docker部署,解决实际遇到的问题
📁 灵活存储 - 将Docker数据存储在 /opt/docker
,便于管理和备份
👤 用户友好 - 配置免sudo使用,提供丰富的管理别名
🛠️ 工具完整 - 包含监控、维护、故障排除等完整工具集
🔍 验证全面 - 每个步骤都有验证,确保部署成功
📊 完成后的效果
- ✅ Docker完全正常工作,数据存储在
/opt/docker
- ✅ 普通用户可以直接使用Docker命令(无需sudo)
- ✅ WSL2重启后Docker自动启动
- ✅ 提供20+个便捷的管理别名(如
dstatus
,dclean
等) - ✅ 完整的监控和维护脚本
- ✅ 详细的故障排除方案
📚 教程目录
🧹 第零步:完全卸载现有Docker
🔧 第一步:系统准备
📁 第二步:创建Docker数据目录
🔑 第三步:Docker仓库配置
⚙️ 第四步:Docker配置(安装前配置)
📦 第五步:安装Docker
🚀 第六步:启动和配置Docker服务
👤 第七步:配置普通用户免sudo使用Docker
🧪 第八步:功能测试
🎨 第九步:WSL2优化配置
🧹 第十步:系统清理和优化
🔍 第十一步:权限验证和故障排除
✅ 第十二步:最终验证和完成确认
🛠️ 第十三步:故障排除指南
📖 第十四步:使用指南和最佳实践
🎉 第十五步:完成确认和总结
⏱️ 预计用时
总时长: 约30-45分钟
难度: 中等(有详细指导)
环境: WSL2 + Ubuntu 22.04
前置说明
环境要求
- Windows 11/10 with WSL2
- Ubuntu 22.04.5 LTS (jammy)
- WSL2内核版本:5.10.16.3-microsoft-standard-WSL2
- 足够的磁盘空间(建议至少10GB)
- 主机做子系统开启网络镜像,在子系统可使用主机的代理网络
第零步:完全卸载现有Docker
0.1 停止所有Docker相关服务和进程
javascript
# 停止所有运行中的容器
sudo docker stop $(sudo docker ps -q) 2>/dev/null || echo "没有运行中的容器"
# 停止Docker服务
sudo service docker stop 2>/dev/null || echo "Docker服务未运行"
# 强制杀死所有Docker相关进程
sudo pkill -f dockerd 2>/dev/null || echo "没有dockerd进程"
sudo pkill -f containerd 2>/dev/null || echo "没有containerd进程"
sudo pkill -f docker-proxy 2>/dev/null || echo "没有docker-proxy进程"
# 确认进程已停止
ps aux | grep docker
0.2 卸载所有Docker软件包
bash
# 卸载Docker CE相关包
sudo apt purge -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# 卸载其他可能的Docker包
sudo apt purge -y docker docker-engine docker.io containerd runc
# 清理依赖包
sudo apt autoremove -y
sudo apt autoclean
0.3 删除所有Docker数据和配置文件
bash
# 删除Docker配置目录
sudo rm -rf /etc/docker
# 删除Docker数据目录(可能的位置)
sudo rm -rf /var/lib/docker
sudo rm -rf /data/docker
sudo rm -rf /opt/docker-data
sudo rm -rf /opt/docker
# 删除运行时文件
sudo rm -rf /var/run/docker*
sudo rm -rf /run/docker*
# 删除日志文件
sudo rm -rf /var/log/docker*
# 删除网络配置
sudo rm -rf /var/lib/containerd
# 删除用户配置
rm -rf ~/.docker 2>/dev/null || echo "用户Docker配置不存在"
0.4 清理APT仓库和密钥
bash
# 删除Docker仓库配置
sudo rm -f /etc/apt/sources.list.d/docker.list
# 删除GPG密钥
sudo rm -f /usr/share/keyrings/docker*.gpg
sudo rm -f /usr/share/keyrings/docker-archive-keyring.gpg
# 删除Docker用户组
sudo groupdel docker 2>/dev/null || echo "docker组不存在"
# 从用户组中移除docker
sudo gpasswd -d $USER docker 2>/dev/null || echo "用户不在docker组中"
0.5 验证卸载完成
bash
# 检查Docker命令是否还存在
docker --version 2>/dev/null && echo "⚠️ Docker仍然存在" || echo "✅ Docker已卸载"
# 检查Docker进程
ps aux | grep docker && echo "⚠️ 仍有Docker进程" || echo "✅ 没有Docker进程"
# 检查Docker文件
ls -la /var/lib/docker 2>/dev/null && echo "⚠️ Docker数据文件仍存在" || echo "✅ Docker数据文件已清理"
# 更新APT包列表
sudo apt update
echo "=== Docker卸载完成 ==="
第一步:系统准备
1.1 检查系统环境
bash
# 检查系统版本
lsb_release -a
# 检查内核版本
uname -r
# 检查磁盘空间
df -h
# 检查当前用户
whoami
id
1.2 更新系统
markdown
# 更新包列表
sudo apt update
# 升级系统包
sudo apt upgrade -y
# 安装必要的依赖包
sudo apt install -y \
apt-transport-https \
ca-certificates \
curl \
gnupg \
lsb-release \
software-properties-common \
iptables \
wget \
jq
1.3 配置iptables(WSL2需要)
bash
# 更新iptables替代方案
sudo update-alternatives --set iptables /usr/sbin/iptables-legacy
sudo update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy
# 验证iptables配置
sudo iptables --version
第二步:创建Docker数据目录
2.1 创建目标目录
bash
# 创建Docker数据目录
sudo mkdir -p /opt/docker
# 设置目录所有者和权限
sudo chown root:root /opt/docker
sudo chmod 755 /opt/docker
# 验证目录创建
ls -ld /opt/docker
2.2 测试目录权限
bash
# 测试目录权限
sudo touch /opt/docker/test-permission
sudo rm /opt/docker/test-permission && echo "/opt/docker 权限正常" || echo "/opt/docker 权限有问题"
2.3 创建Docker子目录结构
bash
# 预创建一些重要的子目录
sudo mkdir -p /opt/docker/{containers,image,network,volumes,swarm,tmp,plugins}
# 验证目录结构
sudo ls -la /opt/docker/
第三步:Docker仓库配置
3.1 清理可能存在的旧配置
bash
# 删除可能存在的旧配置
sudo rm -f /etc/apt/sources.list.d/docker.list
sudo rm -f /usr/share/keyrings/docker-archive-keyring.gpg
sudo rm -f /usr/share/keyrings/docker.gpg
# 确保目录存在
sudo mkdir -p /usr/share/keyrings
3.2 添加Docker官方GPG密钥
bash
# 下载Docker GPG密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker.gpg
# 设置密钥文件权限
sudo chmod a+r /usr/share/keyrings/docker.gpg
# 验证密钥文件
ls -la /usr/share/keyrings/docker.gpg
# 验证密钥内容
sudo gpg --no-default-keyring --keyring /usr/share/keyrings/docker.gpg --list-keys
3.3 添加Docker仓库
bash
# 添加Docker仓库到APT源
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 验证仓库配置
cat /etc/apt/sources.list.d/docker.list
# 更新包列表
sudo apt update
3.4 验证Docker仓库
bash
# 检查Docker包是否可用
apt-cache policy docker-ce
# 查看可用的Docker版本
apt-cache madison docker-ce | head -5
第四步:Docker配置(安装前配置)
4.1 创建Docker配置目录
bash
# 创建Docker配置目录
sudo mkdir -p /etc/docker
# 设置配置目录权限
sudo chown root:root /etc/docker
sudo chmod 755 /etc/docker
4.2 创建daemon.json配置文件
php
# 创建优化的Docker配置文件
sudo tee /etc/docker/daemon.json > /dev/null <<EOF
{
"data-root": "/opt/docker",
"storage-driver": "overlay2",
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
},
"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn",
"https://mirror.baidubce.com"
],
"max-concurrent-downloads": 10,
"max-concurrent-uploads": 5,
"iptables": true,
"ip-forward": true,
"bridge": "docker0",
"default-address-pools": [
{
"base": "172.17.0.0/16",
"size": 24
}
],
"experimental": false,
"features": {
"buildkit": true
},
"insecure-registries": []
}
EOF
# 验证配置文件
echo "Docker daemon配置:"
cat /etc/docker/daemon.json
# 验证JSON格式
jq . /etc/docker/daemon.json && echo "配置文件格式正确" || echo "配置文件格式错误"
第五步:安装Docker
5.1 安装Docker Engine
bash
# 安装Docker CE及相关组件
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# 验证安装
docker --version
docker compose version
5.2 验证Docker安装
bash
# 检查Docker二进制文件
which docker
which dockerd
# 检查Docker组件
dpkg -l | grep docker
第六步:启动和配置Docker服务
6.1 启动Docker服务
perl
# 启动Docker服务
sudo service docker start
# 等待服务启动
sleep 5
# 检查服务状态
sudo service docker status
# 检查Docker进程
ps aux | grep dockerd | grep -v grep
6.2 验证Docker守护进程
bash
# 检查Docker守护进程配置
sudo docker info | head -20
# 验证数据目录配置
echo "Docker数据根目录:"
sudo docker info | grep "Docker Root Dir"
# 检查Docker socket
ls -la /var/run/docker.sock
6.3 验证目录结构
bash
# 检查/opt/docker目录结构
echo "Docker数据目录结构:"
sudo ls -la /opt/docker/
# 注意:Docker子目录是按需创建的,运行容器后才会出现
echo ""
echo "注意:以下目录由Docker按需创建,初始安装后可能不存在:"
for dir in containers image network volumes; do
if [ -d "/opt/docker/$dir" ]; then
echo "✓ $dir 目录存在"
else
echo "• $dir 目录将在使用时自动创建"
fi
done
# 验证Docker是否能在此目录中工作
echo ""
echo "验证Docker数据目录功能:"
if docker info | grep -q "/opt/docker"; then
echo "✓ Docker数据根目录配置正确"
else
echo "✗ Docker数据根目录配置可能有问题"
fi
第七步:配置普通用户免sudo使用Docker
7.1 创建docker用户组并添加用户
bash
# 检查docker组是否存在
getent group docker || echo "docker组不存在,需要创建"
# 创建docker用户组(如果不存在)
sudo groupadd docker 2>/dev/null || echo "docker组已存在"
# 将当前用户添加到docker组
sudo usermod -aG docker $USER
# 验证用户组配置
echo "当前用户组信息:"
id $USER
# 显示docker组成员
echo "docker组成员:"
getent group docker
7.2 配置Docker socket权限
bash
# 设置Docker socket权限
sudo chown root:docker /var/run/docker.sock
sudo chmod 660 /var/run/docker.sock
# 验证socket权限
echo "Docker socket权限:"
ls -la /var/run/docker.sock
7.3 应用用户组权限
bash
# 方法1: 使用newgrp命令(当前会话生效)
echo "使用newgrp命令应用权限..."
newgrp docker
# 方法2: 手动重新加载权限
echo "或者,退出并重新登录WSL终端以应用权限"
echo "在Windows PowerShell中运行: wsl --terminate Ubuntu-22.04"
echo "然后重新打开WSL终端"
7.4 测试普通用户权限
bash
# 测试不使用sudo的Docker命令
echo "测试普通用户Docker权限..."
docker --version
docker info | head -5
# 如果上述命令失败,说明需要重新登录
if ! docker info >/dev/null 2>&1; then
echo "⚠️ 权限尚未生效,请执行以下操作之一:"
echo "1. 运行: newgrp docker"
echo "2. 或者重新登录WSL终端"
echo "3. 或者在Windows PowerShell中运行: wsl --terminate Ubuntu-22.04 然后重新打开"
else
echo "✅ 普通用户Docker权限配置成功!"
fi
第八步:功能测试
8.1 基本功能测试(使用普通用户权限)
bash
# 运行hello-world测试(不使用sudo)
docker run hello-world
# 检查镜像是否正确存储
docker images
# 检查容器历史
docker ps -a
# 验证镜像存储位置
sudo ls -la /opt/docker/image/overlay2/imagedb/content/sha256/ 2>/dev/null || echo "镜像目录结构可能不同"
8.2 网络功能测试
bash
# 测试网络功能
docker network ls
# 创建测试网络
docker network create test-network
# 验证网络配置文件
sudo ls -la /opt/docker/network/
# 删除测试网络
docker network rm test-network
8.3 卷功能测试
bash
# 测试卷功能
docker volume create test-volume
# 查看卷列表
docker volume ls
# 检查卷存储位置
sudo ls -la /opt/docker/volumes/
# 删除测试卷
docker volume rm test-volume
8.4 容器功能测试
bash
# 运行一个更复杂的测试容器
docker run -d --name test-nginx -p 8080:80 nginx:alpine
# 检查容器状态
docker ps
# 测试网络连接
sleep 3
curl -I http://localhost:8080 2>/dev/null && echo "容器网络正常" || echo "网络连接失败(可能端口被占用)"
# 检查容器数据存储
sudo ls -la /opt/docker/containers/
# 查看容器日志
docker logs test-nginx
# 清理测试容器
docker stop test-nginx
docker rm test-nginx
docker rmi nginx:alpine hello-world
第九步:WSL2优化配置
9.1 创建Docker管理脚本
bash
# 创建Docker启动脚本
sudo tee /usr/local/bin/start-docker.sh > /dev/null <<'EOF'
#!/bin/bash
# WSL2 Docker启动脚本 - 数据存储在/opt/docker
echo "=== Docker启动检查 ==="
echo "时间: $(date)"
# 检查Docker是否运行
if pgrep -f dockerd > /dev/null; then
echo "✓ Docker服务: 已运行"
DATA_DIR=$(docker info 2>/dev/null | grep 'Docker Root Dir' | awk '{print $4}')
echo "✓ 数据目录: $DATA_DIR"
else
echo "启动Docker服务..."
sudo service docker start
# 等待服务启动
sleep 3
# 验证启动
if pgrep -f dockerd > /dev/null; then
echo "✓ Docker服务: 启动成功"
DATA_DIR=$(docker info 2>/dev/null | grep 'Docker Root Dir' | awk '{print $4}')
echo "✓ 数据目录: $DATA_DIR"
else
echo "✗ Docker服务: 启动失败"
echo "检查日志: sudo tail -20 /var/log/syslog | grep docker"
exit 1
fi
fi
# 检查socket权限
if [ -S /var/run/docker.sock ]; then
echo "✓ Docker socket: 正常"
# 检查用户是否有权限使用Docker
if docker info >/dev/null 2>&1; then
echo "✓ 用户权限: 正常(可以免sudo使用Docker)"
else
echo "⚠️ 用户权限: 需要重新登录WSL或运行 newgrp docker"
fi
else
echo "✗ Docker socket: 异常"
fi
echo "===================="
EOF
# 设置执行权限
sudo chmod +x /usr/local/bin/start-docker.sh
# 测试脚本
/usr/local/bin/start-docker.sh
9.2 创建Docker状态监控脚本
bash
# 创建Docker状态监控脚本
sudo tee /usr/local/bin/docker-status.sh > /dev/null <<'EOF'
#!/bin/bash
# Docker状态监控脚本
echo "=== Docker系统状态 ==="
echo "时间: $(date)"
echo ""
# 检查服务状态
if pgrep -f dockerd > /dev/null; then
echo "✓ Docker服务: 运行中 (PID: $(pgrep -f dockerd))"
else
echo "✗ Docker服务: 未运行"
fi
# 检查数据目录
if docker info >/dev/null 2>&1; then
DATA_DIR=$(docker info 2>/dev/null | grep "Docker Root Dir" | awk '{print $4}')
if [ "$DATA_DIR" = "/opt/docker" ]; then
echo "✓ 数据目录: $DATA_DIR (正确)"
echo " 目录大小: $(sudo du -sh /opt/docker 2>/dev/null | cut -f1)"
else
echo "✗ 数据目录: $DATA_DIR (错误)"
fi
# 检查用户权限
if docker info >/dev/null 2>&1; then
echo "✓ 用户权限: 正常(免sudo)"
else
echo "✗ 用户权限: 需要sudo或重新登录"
fi
else
echo "✗ 无法连接到Docker守护进程"
fi
# 检查资源使用
echo ""
echo "资源统计:"
if docker info >/dev/null 2>&1; then
echo "- 镜像数量: $(docker images -q 2>/dev/null | wc -l)"
echo "- 容器数量: $(docker ps -aq 2>/dev/null | wc -l)"
echo "- 运行中容器: $(docker ps -q 2>/dev/null | wc -l)"
echo "- 卷数量: $(docker volume ls -q 2>/dev/null | wc -l)"
echo "- 网络数量: $(docker network ls -q 2>/dev/null | wc -l)"
echo ""
echo "磁盘使用:"
docker system df 2>/dev/null || echo "无法获取磁盘使用信息"
else
echo "无法连接到Docker守护进程"
fi
echo "========================"
EOF
# 设置执行权限
sudo chmod +x /usr/local/bin/docker-status.sh
# 测试脚本
/usr/local/bin/docker-status.sh
9.3 配置自动启动和别名
ini
# 备份当前的.bashrc
cp ~/.bashrc ~/.bashrc.backup
# 在.bashrc中添加Docker自动启动
cat >> ~/.bashrc << 'EOF'
# ======== Docker配置 - 数据存储在/opt/docker ========
# 自动启动Docker服务
if ! pgrep -f dockerd > /dev/null; then
echo 'Docker服务未运行,正在启动...'
sudo service docker start > /dev/null 2>&1
sleep 2
fi
# Docker管理别名
alias dstart='sudo service docker start'
alias dstop='sudo service docker stop'
alias drestart='sudo service docker restart'
alias dstatus='/usr/local/bin/docker-status.sh'
alias dinfo='docker info | head -20'
alias dps='docker ps -a'
alias dimages='docker images'
alias dclean='docker system prune -f'
alias dspace='docker system df'
alias dlogs='docker logs'
alias dexec='docker exec -it'
# Docker快捷功能
alias docker-check='/usr/local/bin/start-docker.sh'
alias docker-monitor='/usr/local/bin/docker-status.sh'
# 显示Docker数据目录大小
alias dsize='echo "Docker数据目录大小: $(sudo du -sh /opt/docker 2>/dev/null | cut -f1)"'
echo "Docker别名已加载。运行 'dstatus' 查看Docker状态"
EOF
echo "Docker配置已添加到 ~/.bashrc"
echo "请运行 'source ~/.bashrc' 或重新登录以应用配置"
第十步:系统清理和优化
10.1 清理安装临时文件
perl
# 清理APT缓存
sudo apt autoremove -y
sudo apt autoclean
# 清理Docker构建缓存
docker system prune -f
10.2 创建定期维护脚本
bash
# 创建Docker维护脚本
sudo tee /usr/local/bin/docker-maintenance.sh > /dev/null <<'EOF'
#!/bin/bash
# Docker定期维护脚本
echo "=== Docker系统维护 ==="
echo "开始时间: $(date)"
# 显示维护前状态
echo "维护前状态:"
docker system df
# 清理未使用的资源
echo ""
echo "清理未使用的Docker资源..."
docker system prune -f
# 清理未使用的卷
echo "清理未使用的卷..."
docker volume prune -f
# 清理未使用的镜像
echo "清理未使用的镜像..."
docker image prune -a -f
# 显示清理后的状态
echo ""
echo "清理后状态:"
docker system df
echo ""
echo "数据目录大小: $(sudo du -sh /opt/docker 2>/dev/null | cut -f1)"
echo "完成时间: $(date)"
echo "====================="
EOF
# 设置执行权限
sudo chmod +x /usr/local/bin/docker-maintenance.sh
# 添加别名(会在重启终端后生效)
echo "alias dmaintenance='/usr/local/bin/docker-maintenance.sh'" >> ~/.bashrc
第十一步:权限验证和故障排除
11.1 完整权限验证
bash
# 创建权限测试脚本
sudo tee /usr/local/bin/test-docker-permissions.sh > /dev/null <<'EOF'
#!/bin/bash
# Docker权限测试脚本
echo "=== Docker权限完整测试 ==="
echo "当前用户: $(whoami)"
echo "用户ID: $(id)"
echo ""
# 测试1: 基本命令
echo "测试1: 基本Docker命令"
if docker --version >/dev/null 2>&1; then
echo "✅ docker --version: 成功"
else
echo "❌ docker --version: 失败"
fi
# 测试2: Docker info
echo ""
echo "测试2: Docker守护进程连接"
if docker info >/dev/null 2>&1; then
echo "✅ docker info: 成功"
else
echo "❌ docker info: 失败"
echo " 可能需要运行: newgrp docker 或重新登录"
fi
# 测试3: 镜像操作
echo ""
echo "测试3: 镜像操作"
if docker images >/dev/null 2>&1; then
echo "✅ docker images: 成功"
else
echo "❌ docker images: 失败"
fi
# 测试4: 容器操作
echo ""
echo "测试4: 容器操作测试"
if docker run --rm hello-world >/dev/null 2>&1; then
echo "✅ docker run: 成功"
else
echo "❌ docker run: 失败"
fi
# 测试5: 数据目录验证
echo ""
echo "测试5: 数据目录验证"
DATA_DIR=$(docker info 2>/dev/null | grep "Docker Root Dir" | awk '{print $4}')
if [ "$DATA_DIR" = "/opt/docker" ]; then
echo "✅ 数据目录: $DATA_DIR (正确)"
else
echo "❌ 数据目录: $DATA_DIR (不正确)"
fi
echo ""
echo "=== 测试完成 ==="
# 如果有失败的测试,提供解决方案
if ! docker info >/dev/null 2>&1; then
echo ""
echo "🔧 权限修复方案:"
echo "1. 运行: newgrp docker"
echo "2. 或重新登录WSL: 在PowerShell中运行 wsl --terminate Ubuntu-22.04"
echo "3. 或检查用户组: getent group docker"
echo "4. 或重新添加用户: sudo usermod -aG docker $USER"
fi
EOF
# 设置执行权限
sudo chmod +x /usr/local/bin/test-docker-permissions.sh
# 运行权限测试
/usr/local/bin/test-docker-permissions.sh
11.2 权限问题解决方案
bash
# 如果权限测试失败,执行以下步骤
echo "=== Docker权限问题解决方案 ==="
# 1. 检查docker组
echo "1. 检查docker组:"
getent group docker
# 2. 检查当前用户是否在docker组中
echo ""
echo "2. 检查用户组成员关系:"
groups $USER | grep docker && echo "✅ 用户在docker组中" || echo "❌ 用户不在docker组中"
# 3. 重新添加用户到docker组(如果需要)
echo ""
echo "3. 重新添加用户到docker组:"
sudo usermod -aG docker $USER
echo "用户已重新添加到docker组"
# 4. 检查socket权限
echo ""
echo "4. 检查socket权限:"
ls -la /var/run/docker.sock
# 5. 修复socket权限(如果需要)
echo ""
echo "5. 修复socket权限:"
sudo chown root:docker /var/run/docker.sock
sudo chmod 660 /var/run/docker.sock
echo "Socket权限已修复"
# 6. 应用权限的方法
echo ""
echo "6. 应用权限方法(选择其中一种):"
echo " 方法A: 运行 'newgrp docker' (当前会话生效)"
echo " 方法B: 重新登录WSL终端"
echo " 方法C: 在PowerShell中运行 'wsl --terminate Ubuntu-22.04' 然后重新打开"
echo ""
echo "建议: 重新登录WSL以确保权限完全生效"
第十二步:最终验证和完成确认
12.1 最终验证脚本
bash
# 创建最终验证脚本
sudo tee /usr/local/bin/final-docker-verification.sh > /dev/null <<'EOF'
#!/bin/bash
# Docker部署最终验证脚本
echo "=========================================="
echo " Docker部署最终验证"
echo "=========================================="
echo "验证时间: $(date)"
echo "系统信息: $(lsb_release -d | cut -f2)"
echo "当前用户: $(whoami)"
echo ""
# 1. 版本信息检查
echo "1. 版本信息检查:"
echo " Docker: $(docker --version 2>/dev/null || echo '未安装或无权限')"
echo " Compose: $(docker compose version 2>/dev/null || echo '未安装或无权限')"
echo ""
# 2. 服务状态检查
echo "2. 服务状态检查:"
if pgrep -f dockerd > /dev/null; then
echo " ✅ Docker服务: 运行中"
else
echo " ❌ Docker服务: 未运行"
fi
echo ""
# 3. 权限检查
echo "3. 用户权限检查:"
if docker info >/dev/null 2>&1; then
echo " ✅ 普通用户权限: 正常(免sudo)"
else
echo " ❌ 普通用户权限: 需要修复"
fi
echo ""
# 4. 数据目录验证
echo "4. 数据目录验证:"
if docker info >/dev/null 2>&1; then
DATA_DIR=$(docker info | grep "Docker Root Dir" | awk '{print $4}')
if [ "$DATA_DIR" = "/opt/docker" ]; then
echo " ✅ 数据目录: $DATA_DIR (正确)"
echo " 📁 目录大小: $(sudo du -sh /opt/docker 2>/dev/null | cut -f1)"
else
echo " ❌ 数据目录: $DATA_DIR (错误)"
fi
else
echo " ❌ 无法获取数据目录信息"
fi
echo ""
# 5. 功能测试
echo "5. 基本功能测试:"
if docker run --rm alpine:latest echo "Docker功能测试成功" >/dev/null 2>&1; then
echo " ✅ 容器运行: 正常"
else
echo " ❌ 容器运行: 失败"
fi
if docker images >/dev/null 2>&1; then
echo " ✅ 镜像管理: 正常"
else
echo " ❌ 镜像管理: 失败"
fi
if docker network ls >/dev/null 2>&1; then
echo " ✅ 网络管理: 正常"
else
echo " ❌ 网络管理: 失败"
fi
if docker volume ls >/dev/null 2>&1; then
echo " ✅ 卷管理: 正常"
else
echo " ❌ 卷管理: 失败"
fi
echo ""
# 6. 资源统计
echo "6. 资源统计:"
if docker info >/dev/null 2>&1; then
echo " - 镜像数量: $(docker images -q 2>/dev/null | wc -l)"
echo " - 容器数量: $(docker ps -aq 2>/dev/null | wc -l)"
echo " - 运行中容器: $(docker ps -q 2>/dev/null | wc -l)"
echo " - 卷数量: $(docker volume ls -q 2>/dev/null | wc -l)"
echo " - 网络数量: $(docker network ls -q 2>/dev/null | wc -l)"
else
echo " 无法获取资源统计"
fi
echo ""
# 7. 可用命令
echo "7. 可用管理命令:"
echo " - dstatus: 查看Docker状态"
echo " - dstart/dstop: 启动/停止Docker"
echo " - dps: 查看容器"
echo " - dimages: 查看镜像"
echo " - dclean: 清理资源"
echo " - dsize: 查看数据目录大小"
echo " - dmaintenance: 运行维护任务"
echo ""
# 8. 部署结果
echo "8. 部署结果:"
ALL_GOOD=true
# 检查各项是否正常
if ! pgrep -f dockerd > /dev/null; then
ALL_GOOD=false
fi
if ! docker info >/dev/null 2>&1; then
ALL_GOOD=false
fi
DATA_DIR=$(docker info 2>/dev/null | grep "Docker Root Dir" | awk '{print $4}')
if [ "$DATA_DIR" != "/opt/docker" ]; then
ALL_GOOD=false
fi
if $ALL_GOOD; then
echo " 🎉 部署成功!Docker已完全配置到/opt/docker目录"
echo " 🎉 普通用户可以免sudo使用Docker命令"
else
echo " ⚠️ 部署存在问题,请检查上述失败项目"
fi
echo ""
echo "=========================================="
echo "验证完成时间: $(date)"
echo "=========================================="
EOF
# 设置执行权限
sudo chmod +x /usr/local/bin/final-docker-verification.sh
# 运行最终验证
/usr/local/bin/final-docker-verification.sh
12.2 创建部署完成报告
javascript
# 生成部署报告
REPORT_FILE="$HOME/docker-deployment-report-$(date +%Y%m%d_%H%M%S).txt"
cat > "$REPORT_FILE" << EOF
========================================
Docker部署完成报告
========================================
部署时间: $(date)
系统信息: $(lsb_release -d | cut -f2)
内核版本: $(uname -r)
用户: $(whoami)
版本信息:
$(docker --version 2>/dev/null || echo "Docker: 未安装或无权限")
$(docker compose version 2>/dev/null || echo "Docker Compose: 未安装或无权限")
配置信息:
数据目录: $(docker info 2>/dev/null | grep "Docker Root Dir" | awk '{print $4}' || echo "无法获取")
数据目录大小: $(sudo du -sh /opt/docker 2>/dev/null | cut -f1 || echo "无法获取")
存储驱动: $(docker info 2>/dev/null | grep "Storage Driver" | awk '{print $3}' || echo "无法获取")
用户权限:
当前用户组: $(groups $USER)
Docker组成员: $(getent group docker || echo "docker组不存在")
免sudo权限: $(docker info >/dev/null 2>&1 && echo "✅ 正常" || echo "❌ 需要修复")
资源统计:
镜像数量: $(docker images -q 2>/dev/null | wc -l || echo "0")
容器数量: $(docker ps -aq 2>/dev/null | wc -l || echo "0")
卷数量: $(docker volume ls -q 2>/dev/null | wc -l || echo "0")
网络数量: $(docker network ls -q 2>/dev/null | wc -l || echo "0")
可用管理命令:
- dstatus: 查看Docker状态
- dstart/dstop/drestart: 启动/停止/重启Docker
- dps: 查看容器 (docker ps -a)
- dimages: 查看镜像 (docker images)
- dclean: 清理资源 (docker system prune)
- dsize: 查看数据目录大小
- dmaintenance: 运行维护任务
- docker-check: 启动检查脚本
- docker-monitor: 状态监控脚本
管理脚本位置:
- /usr/local/bin/start-docker.sh
- /usr/local/bin/docker-status.sh
- /usr/local/bin/docker-maintenance.sh
- /usr/local/bin/test-docker-permissions.sh
- /usr/local/bin/final-docker-verification.sh
配置文件:
- Docker配置: /etc/docker/daemon.json
- 用户配置: ~/.bashrc (已添加Docker别名)
注意事项:
1. WSL2重启后需要手动启动Docker服务(已配置自动启动)
2. 如果用户权限有问题,运行: newgrp docker 或重新登录
3. 定期运行 dmaintenance 清理资源
4. 备份重要的容器数据
========================================
报告生成时间: $(date)
========================================
EOF
echo "部署报告已保存到: $REPORT_FILE"
echo ""
echo "查看报告: cat $REPORT_FILE"
第十三步:故障排除指南
13.1 常见问题及解决方案
问题1: GPG密钥错误
bash
# 如果遇到GPG密钥问题
echo "=== 修复GPG密钥问题 ==="
# 清理旧密钥
sudo rm -f /usr/share/keyrings/docker*
# 重新下载密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker.gpg
sudo chmod a+r /usr/share/keyrings/docker.gpg
# 验证密钥
sudo gpg --no-default-keyring --keyring /usr/share/keyrings/docker.gpg --list-keys
问题2: 用户权限问题
bash
# 修复用户权限问题
echo "=== 修复用户权限问题 ==="
# 确保docker组存在
sudo groupadd docker 2>/dev/null || echo "docker组已存在"
# 重新添加用户到docker组
sudo usermod -aG docker $USER
# 修复socket权限
sudo chown root:docker /var/run/docker.sock
sudo chmod 660 /var/run/docker.sock
# 应用权限
echo "请选择以下方法之一应用权限:"
echo "1. 运行: newgrp docker"
echo "2. 重新登录WSL终端"
echo "3. 在PowerShell中运行: wsl --terminate Ubuntu-22.04"
问题3: 数据目录权限问题
bash
# 修复数据目录权限
echo "=== 修复数据目录权限问题 ==="
# 修复目录权限
sudo chown -R root:root /opt/docker
sudo chmod -R 755 /opt/docker
# 如果/opt/docker有问题,使用备用目录
if [ ! -w /opt/docker ]; then
echo "⚠️ /opt/docker权限有问题,建议使用备用目录"
echo "1. 创建备用目录: sudo mkdir -p /home/docker-data"
echo "2. 修改配置: sudo nano /etc/docker/daemon.json"
echo "3. 将data-root改为: /home/docker-data"
echo "4. 重启Docker: sudo service docker restart"
fi
问题4: WSL2网络问题
bash
# 修复WSL2网络问题
echo "=== 修复WSL2网络问题 ==="
# 重启Docker网络
sudo service docker restart
# 检查iptables
sudo iptables -L -n | head -10
# 重新配置iptables
sudo update-alternatives --set iptables /usr/sbin/iptables-legacy
sudo update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy
# 如果还有问题,在Windows中重启WSL2
echo "如果网络仍有问题,在Windows PowerShell中运行:"
echo "wsl --shutdown"
echo "然后重新打开WSL终端"
13.2 完整重新安装脚本
bash
# 创建完整重新安装脚本(如果需要)
sudo tee /usr/local/bin/reinstall-docker.sh > /dev/null <<'EOF'
#!/bin/bash
# Docker完整重新安装脚本
echo "=== Docker完整重新安装 ==="
echo "⚠️ 这将删除所有Docker数据!"
read -p "确定要继续吗? (yes/no): " confirm
if [ "$confirm" != "yes" ]; then
echo "取消重新安装"
exit 1
fi
echo "开始重新安装..."
# 1. 停止Docker
sudo service docker stop 2>/dev/null || true
sudo pkill -f dockerd 2>/dev/null || true
# 2. 卸载Docker
sudo apt purge -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo apt autoremove -y
# 3. 删除所有数据和配置
sudo rm -rf /opt/docker
sudo rm -rf /var/lib/docker
sudo rm -rf /etc/docker
sudo rm -rf /var/run/docker*
sudo rm -f /etc/apt/sources.list.d/docker.list
sudo rm -f /usr/share/keyrings/docker*
# 4. 删除用户组
sudo groupdel docker 2>/dev/null || true
echo "卸载完成,请重新运行安装脚本"
EOF
sudo chmod +x /usr/local/bin/reinstall-docker.sh
第十四步:使用指南和最佳实践
14.1 日常使用指南
bash
# 创建使用指南
cat > ~/docker-usage-guide.md << 'EOF'
# Docker 使用指南
## 基本命令(已配置免sudo)
```bash
# 查看状态
dstatus # 查看详细状态
docker ps # 查看运行中的容器
docker ps -a # 查看所有容器
docker images # 查看镜像
# 启动/停止服务
dstart # 启动Docker服务
dstop # 停止Docker服务
drestart # 重启Docker服务
# 资源管理
dclean # 清理未使用的资源
dsize # 查看数据目录大小
dspace # 查看磁盘使用情况
dmaintenance # 运行完整维护
# 容器操作
docker run -it ubuntu bash # 交互式运行容器
docker run -d --name myapp nginx # 后台运行容器
docker exec -it myapp bash # 进入运行中的容器
docker logs myapp # 查看容器日志
docker stop myapp # 停止容器
docker rm myapp # 删除容器
数据持久化
bash
# 使用卷持久化数据
docker volume create mydata
docker run -d -v mydata:/data nginx
# 绑定主机目录
docker run -d -v /home/user/data:/data nginx
网络配置
lua
# 创建自定义网络
docker network create mynetwork
docker run -d --network mynetwork nginx
最佳实践
- 定期运行
dmaintenance
清理资源 - 使用
dstatus
监控系统状态 - 重要数据使用卷或绑定挂载持久化
- 定期备份重要的容器数据
- 避免在容器中存储重要数据
故障排除
- 权限问题:
newgrp docker
或重新登录 - 服务问题:
dstart
或drestart
- 磁盘满:
dclean
或dmaintenance
- 网络问题: 重启WSL2或Docker服务 EOF
echo "使用指南已保存到: ~/docker-usage-guide.md"
bash
### 14.2 定期维护计划
```bash
# 创建维护计划脚本
sudo tee /usr/local/bin/docker-weekly-maintenance.sh > /dev/null <<'EOF'
#!/bin/bash
# Docker 周维护脚本
echo "=== Docker 周维护 ==="
echo "开始时间: $(date)"
# 1. 检查系统状态
echo ""
echo "1. 系统状态检查:"
/usr/local/bin/docker-status.sh
# 2. 备份重要配置
echo ""
echo "2. 备份配置文件:"
sudo cp /etc/docker/daemon.json /tmp/daemon.json.backup.$(date +%Y%m%d)
echo "配置已备份到 /tmp/daemon.json.backup.$(date +%Y%m%d)"
# 3. 清理系统
echo ""
echo "3. 系统清理:"
docker system prune -f
docker volume prune -f
docker image prune -f
# 4. 检查磁盘使用
echo ""
echo "4. 磁盘使用检查:"
echo "Docker数据目录: $(sudo du -sh /opt/docker | cut -f1)"
docker system df
# 5. 更新镜像(可选)
echo ""
echo "5. 镜像更新建议:"
echo "建议定期更新常用镜像:"
echo "docker pull ubuntu:latest"
echo "docker pull nginx:latest"
echo "docker pull alpine:latest"
echo ""
echo "周维护完成: $(date)"
echo "========================="
EOF
sudo chmod +x /usr/local/bin/docker-weekly-maintenance.sh
# 添加到别名
echo "alias dweekly='/usr/local/bin/docker-weekly-maintenance.sh'" >> ~/.bashrc
第十五步:完成确认和总结
15.1 最终确认清单
bash
# 创建完成确认清单
echo "=== Docker部署完成确认清单 ==="
echo ""
CHECKLIST=(
"Docker服务正常运行"
"数据目录设置为 /opt/docker"
"普通用户可以免sudo使用Docker"
"镜像拉取和容器运行正常"
"网络功能正常"
"卷管理功能正常"
"配置了自动启动"
"管理脚本和别名就位"
"故障排除脚本准备完毕"
)
for i in "${!CHECKLIST[@]}"; do
item="${CHECKLIST[$i]}"
case $i in
0) # Docker服务检查
if pgrep -f dockerd > /dev/null; then
echo "✅ $item"
else
echo "❌ $item - 运行 dstart 启动服务"
fi
;;
1) # 数据目录检查
DATA_DIR=$(docker info 2>/dev/null | grep "Docker Root Dir" | awk '{print $4}')
if [ "$DATA_DIR" = "/opt/docker" ]; then
echo "✅ $item"
else
echo "❌ $item - 当前: $DATA_DIR"
fi
;;
2) # 用户权限检查
if docker info >/dev/null 2>&1; then
echo "✅ $item"
else
echo "❌ $item - 运行 newgrp docker 或重新登录"
fi
;;
3) # 基本功能检查
if docker run --rm hello-world >/dev/null 2>&1; then
echo "✅ $item"
else
echo "❌ $item - 检查Docker服务和权限"
fi
;;
4) # 网络功能检查
if docker network ls >/dev/null 2>&1; then
echo "✅ $item"
else
echo "❌ $item - 检查Docker服务"
fi
;;
5) # 卷功能检查
if docker volume ls >/dev/null 2>&1; then
echo "✅ $item"
else
echo "❌ $item - 检查Docker服务"
fi
;;
6) # 自动启动检查
if grep -q "pgrep -f dockerd" ~/.bashrc; then
echo "✅ $item"
else
echo "❌ $item - 重新运行配置脚本"
fi
;;
7) # 管理脚本检查
if [ -f "/usr/local/bin/docker-status.sh" ] && [ -f "/usr/local/bin/start-docker.sh" ]; then
echo "✅ $item"
else
echo "❌ $item - 重新创建管理脚本"
fi
;;
8) # 故障排除脚本检查
if [ -f "/usr/local/bin/test-docker-permissions.sh" ]; then
echo "✅ $item"
else
echo "❌ $item - 重新创建故障排除脚本"
fi
;;
esac
done
echo ""
echo "=== 部署总结 ==="
echo "如果以上所有项目都显示 ✅,恭喜你!Docker已成功部署完成。"
echo ""
echo "快速开始:"
echo "1. 运行 'dstatus' 查看系统状态"
echo "2. 运行 'docker run hello-world' 测试功能"
echo "3. 查看 '~/docker-usage-guide.md' 了解使用方法"
echo ""
echo "如果有 ❌ 项目,请按照提示进行修复。"
15.2 创建启动欢迎信息
bash
# 添加Docker启动欢迎信息到.bashrc
cat >> ~/.bashrc << 'EOF'
# Docker启动欢迎信息
if command -v docker &> /dev/null; then
if docker info >/dev/null 2>&1; then
echo "🐳 Docker已就绪 | 数据目录: /opt/docker | 运行 'dstatus' 查看状态"
fi
fi
EOF
# 应用配置
source ~/.bashrc
15.3 最终部署报告
bash
echo ""
echo "=========================================="
echo "🎉 Docker部署完成!"
echo "=========================================="
echo ""
echo "📋 部署信息:"
echo " - 系统: $(lsb_release -d | cut -f2)"
echo " - Docker版本: $(docker --version 2>/dev/null || echo '请重新登录以应用权限')"
echo " - 数据目录: /opt/docker"
echo " - 免sudo权限: $(docker info >/dev/null 2>&1 && echo '已配置' || echo '需要重新登录')"
echo ""
echo "🔧 管理命令:"
echo " dstatus - 查看状态"
echo " dstart/dstop - 启动/停止服务"
echo " dclean - 清理资源"
echo " dmaintenance - 维护任务"
echo ""
echo "📚 文档位置:"
echo " - 使用指南: ~/docker-usage-guide.md"
echo " - 部署报告: ~/docker-deployment-report-*.txt"
echo ""
echo "⚠️ 重要提醒:"
echo " 1. 如果用户权限不正常,请重新登录WSL终端"
echo " 2. WSL2重启后Docker会自动启动"
echo " 3. 定期运行 'dmaintenance' 进行系统维护"
echo ""
echo "🎯 下一步:"
echo " 1. 运行 'source ~/.bashrc' 应用配置"
echo " 2. 运行 'dstatus' 检查状态"
echo " 3. 运行 'docker run hello-world' 测试功能"
echo ""
echo "=========================================="
echo "部署完成时间: $(date)"
echo "=========================================="
现在你有了一个完整的Docker部署指南,包含:
✅ 完整卸载过程 - 彻底清理现有Docker安装
✅ 完整安装过程 - 从系统准备到最终验证
✅ 数据目录配置 - 所有数据存储在 /opt/docker
✅ 免sudo配置 - 普通用户可以直接使用Docker命令
✅ WSL2优化 - 针对WSL2环境的特殊配置
✅ 自动启动 - WSL2重启后自动启动Docker
✅ 管理工具 - 完整的管理脚本和别名
✅ 故障排除 - 详细的问题解决方案
✅ 维护指南 - 日常维护和最佳实践
请从第零步开始执行,先完全卸载现有Docker,然后按照指南重新安装。整个过程将确保Docker完美运行在你的WSL2环境中,所有数据都存储在 /opt/docker
目录!