2026-03-01-Windows wsl安装docker

文章发布时间:

最后更新时间:

页面浏览: 加载中...

第一步:系统准备

1.1 检查系统环境

1
2
3
4
5
6
7
8
9
10
11
12
# 检查系统版本
lsb_release -a

# 检查内核版本
uname -r

# 检查磁盘空间
df -h

# 检查当前用户
whoami
id

1.2 更新系统

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 更新包列表
sudo apt update

# 升级系统包
sudo apt upgrade -y

# 安装必要的依赖包
sudo apt install -y \
apt-transport-https \
ca-certificates \
curl \
gnupg \
lsb-release \
iptables \
wget \
jq

1.3 配置iptables(WSL2需要)

1
2
3
4
5
6
# 更新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 创建目标目录

1
2
3
4
5
6
7
8
9
# 创建Docker数据目录
sudo mkdir -p /opt/docker

# 设置目录所有者和权限
sudo chown root:root /opt/docker
sudo chmod 755 /opt/docker

# 验证目录创建
ls -ld /opt/docker

2.2 测试目录权限

1
2
3
# 测试目录权限
sudo touch /opt/docker/test-permission
sudo rm /opt/docker/test-permission && echo "/opt/docker 权限正常" || echo "/opt/docker 权限有问题"

2.3 创建Docker子目录结构

1
2
3
4
5
# 预创建一些重要的子目录
sudo mkdir -p /opt/docker/{containers,image,network,volumes,swarm,tmp,plugins}

# 验证目录结构
sudo ls -la /opt/docker/

第三步:Docker仓库配置

3.1 清理可能存在的旧配置

1
2
3
4
5
6
7
# 删除可能存在的旧配置
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密钥

1
2
3
4
5
6
7
8
9
10
11
# 下载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仓库

1
2
3
4
5
6
7
8
9
10
11
# 添加Docker仓库到APT源
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian \
trixie 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仓库

1
2
3
4
5
# 检查Docker包是否可用
apt-cache policy docker-ce

# 查看可用的Docker版本
apt-cache madison docker-ce | head -5

第四步:Docker配置(安装前配置)

4.1 创建Docker配置目录

1
2
3
4
5
6
# 创建Docker配置目录
sudo mkdir -p /etc/docker

# 设置配置目录权限
sudo chown root:root /etc/docker
sudo chmod 755 /etc/docker

4.2 创建daemon.json配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# 创建优化的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

1
2
3
4
5
6
# 安装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安装

1
2
3
4
5
6
# 检查Docker二进制文件
which docker
which dockerd

# 检查Docker组件
dpkg -l | grep docker

第六步:启动和配置Docker服务

6.1 启动Docker服务

1
2
3
4
5
6
7
8
9
10
11
# 启动Docker服务
sudo service docker start

# 等待服务启动
sleep 5

# 检查服务状态
sudo service docker status

# 检查Docker进程
ps aux | grep dockerd | grep -v grep

6.2 验证Docker守护进程

1
2
3
4
5
6
7
8
9
# 检查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 验证目录结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 检查/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用户组并添加用户

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 检查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权限

1
2
3
4
5
6
7
# 设置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 应用用户组权限

1
2
3
4
5
6
7
8
# 方法1: 使用newgrp命令(当前会话生效)
echo "使用newgrp命令应用权限..."
newgrp docker

# 方法2: 手动重新加载权限
echo "或者,退出并重新登录WSL终端以应用权限"
echo "在Windows PowerShell中运行: wsl --terminate Ubuntu-22.04"
echo "然后重新打开WSL终端"

7.4 测试普通用户权限

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 测试不使用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 基本功能测试(使用普通用户权限)

1
2
3
4
5
6
7
8
9
10
11
# 运行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 网络功能测试

1
2
3
4
5
6
7
8
9
10
11
# 测试网络功能
docker network ls

# 创建测试网络
docker network create test-network

# 验证网络配置文件
sudo ls -la /opt/docker/network/

# 删除测试网络
docker network rm test-network

8.3 卷功能测试

1
2
3
4
5
6
7
8
9
10
11
# 测试卷功能
docker volume create test-volume

# 查看卷列表
docker volume ls

# 检查卷存储位置
sudo ls -la /opt/docker/volumes/

# 删除测试卷
docker volume rm test-volume

8.4 容器功能测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 运行一个更复杂的测试容器
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管理脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# 创建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状态监控脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# 创建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 配置自动启动和别名

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# 备份当前的.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 清理安装临时文件

1
2
3
4
5
6
# 清理APT缓存
sudo apt autoremove -y
sudo apt autoclean

# 清理Docker构建缓存
docker system prune -f

10.2 创建定期维护脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# 创建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

14.1 日常使用指南

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 创建使用指南
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 # 删除容器

数据持久化

1
2
3
4
5
6
# 使用卷持久化数据
docker volume create mydata
docker run -d -v mydata:/data nginx

# 绑定主机目录
docker run -d -v /home/user/data:/data nginx

网络配置

1
2
3
# 创建自定义网络
docker network create mynetwork
docker run -d --network mynetwork nginx

配置代理