FnOS Docker 镜像源优化指南 🐳

🚀 全面指南:加速 Docker 镜像下载,提升容器部署效率,优化 FnOS 系统性能


📋 目录


🎯 快速配置

📝 修改 daemon.json 配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 创建或修改 Docker 配置文件
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json > /dev/null <<'EOF'
{
"data-root": "/vol1/docker",
"insecure-registries": ["127.0.0.1:19827"],
"live-restore": true,
"registry-mirrors": [
"https://docker.1panel.live",
"https://hub.rat.dev",
"https://registry.hub.docker.com"
]
}
EOF

# 重启 Docker 服务
sudo systemctl restart docker
sudo systemctl status docker

# 验证配置是否生效
docker info | grep -i "registry\|mirror"

🔄 配置说明

参数 说明 推荐值 注意事项
data-root Docker 数据存储路径 /vol1/docker 确保目标分区有足够空间
insecure-registries 允许非安全私有仓库 127.0.0.1:19827 仅用于本地或受信任的私有仓库
live-restore 守护进程停止时保持容器运行 true 避免容器意外停止
registry-mirrors 镜像加速器地址 见下文推荐列表 按网络环境选择最佳镜像源

🌐 镜像源推荐

🏆 国内优质镜像源

1
2
3
4
5
6
7
8
9
10
{
"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn", // 中国科学技术大学 - 稳定快速
"https://hub-mirror.c.163.com", // 网易云 - 国内节点多
"https://mirror.baidubce.com", // 百度云 - 百度云用户首选
"https://registry.docker-cn.com", // Docker 中国官方 - 官方源
"https://docker.1panel.live", // 1Panel 镜像 - 专为面板优化
"https://hub.rat.dev" // Rat 镜像站 - 社区维护
]
}

🌍 国际镜像源

1
2
3
4
5
6
7
8
{
"registry-mirrors": [
"https://registry.hub.docker.com", // Docker 官方 - 更新最及时
"https://mirror.gcr.io", // Google Container Registry - Google服务
"https://quay.io", // Red Hat Quay - 企业级仓库
"https://ghcr.io" // GitHub Container Registry - GitHub项目
]
}

📊 镜像源速度测试与选择策略

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 测试镜像源下载速度
echo "测试各镜像源速度..."
MIRRORS=(
"https://docker.mirrors.ustc.edu.cn"
"https://hub-mirror.c.163.com"
"https://mirror.baidubce.com"
"https://docker.1panel.live"
)

for mirror in "${MIRRORS[@]}"; do
echo "测试镜像源: $mirror"
# 临时设置镜像源
sudo sed -i "s|\"registry-mirrors\":.*|\"registry-mirrors\": [\"$mirror\"]|" /etc/docker/daemon.json
sudo systemctl restart docker
# 测试下载速度
time docker pull ubuntu:20.04 >/dev/null 2>&1
docker rmi ubuntu:20.04 >/dev/null 2>&1
done

# 恢复最佳配置
echo "选择最佳镜像源并配置..."

📍 按地区推荐镜像源

地区 首选镜像源 备用镜像源 特点
中国大陆 中国科学技术大学 网易云 教育网优化,稳定性高
华南地区 网易云 百度云 华南节点多,速度快
华东地区 中科大 Docker中国官方 教育网与公网双优
华北地区 百度云 网易云 百度云华北节点
海外用户 Docker官方 GCR镜像 国际链路优化

🔧 手动配置

📁 配置文件详解

1
2
3
4
5
6
7
8
# 主要配置文件位置
/etc/docker/daemon.json

# 备份原有配置
sudo cp /etc/docker/daemon.json /etc/docker/daemon.json.bak.$(date +%Y%m%d)

# 查看当前配置
sudo cat /etc/docker/daemon.json || echo "无配置文件,将创建新配置"

🛠️ 完整配置示例

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
sudo tee /etc/docker/daemon.json > /dev/null <<'EOF'
{
"data-root": "/vol1/docker",
"insecure-registries": [
"127.0.0.1:19827",
"192.168.1.100:5000"
],
"live-restore": true,
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
},
"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn",
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com",
"https://docker.1panel.live"
],
"storage-driver": "overlay2",
"max-concurrent-downloads": 10,
"max-concurrent-uploads": 5,
"default-ulimits": {
"nofile": {
"Name": "nofile",
"Hard": 65536,
"Soft": 65536
}
},
"features": {
"buildkit": true
}
}
EOF

🔄 应用配置更改

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 重新加载配置
sudo systemctl daemon-reload

# 重启 Docker 服务
sudo systemctl restart docker

# 检查配置是否生效
docker info | grep -i "registry\|mirror"

# 查看详细配置信息
docker info | grep -A 20 "Registry Mirrors"

# 检查服务状态
sudo systemctl status docker

# 查看启动日志
sudo journalctl -u docker.service -n 20 --no-pager

⚡ 一键脚本

🎯 自动配置脚本

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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
#!/bin/bash
# FnOS Docker 镜像源自动配置脚本
# 版本: 1.2.0
# 描述: 自动检测网络环境并配置最优Docker镜像源

set -e

echo "🚀 FnOS Docker 镜像源优化脚本 v1.2.0"
echo "=============================================="

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

# 日志函数
log_info() {
echo -e "${GREEN}[INFO]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1"
}

log_warn() {
echo -e "${YELLOW}[WARN]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1"
}

log_error() {
echo -e "${RED}[ERROR]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1"
}

# 检查 Docker 是否安装
check_docker() {
if ! command -v docker &> /dev/null; then
log_error "Docker 未安装,请先安装 Docker"
exit 1
fi
log_info "Docker 已安装,版本: $(docker --version | awk '{print $3}' | tr -d ',')"
}

# 备份原有配置
backup_config() {
local backup_file="/etc/docker/daemon.json.bak.$(date +%Y%m%d_%H%M%S)"
if [ -f /etc/docker/daemon.json ]; then
sudo cp /etc/docker/daemon.json "$backup_file"
log_info "原有配置已备份到: $backup_file"
else
log_warn "未找到原有配置文件,将创建新配置"
fi
}

# 测试镜像源速度
test_mirror_speed() {
local mirror=$1
log_info "测试镜像源速度: $mirror"

# 临时设置单个镜像源
sudo tee /etc/docker/daemon.json > /dev/null <<EOF
{
"registry-mirrors": ["$mirror"]
}
EOF

sudo systemctl restart docker
sleep 2

# 测试下载速度
local start_time=$(date +%s)
docker pull alpine:latest >/dev/null 2>&1 || true
local end_time=$(date +%s)
local duration=$((end_time - start_time))

# 清理
docker rmi alpine:latest >/dev/null 2>&1 || true

echo $duration
}

# 选择最佳镜像源
select_best_mirror() {
declare -A mirror_speeds
local mirrors=(
"https://docker.mirrors.ustc.edu.cn"
"https://hub-mirror.c.163.com"
"https://mirror.baidubce.com"
"https://docker.1panel.live"
"https://registry.docker-cn.com"
)

log_info "开始测试各镜像源速度..."

for mirror in "${mirrors[@]}"; do
local speed=$(test_mirror_speed "$mirror")
mirror_speeds["$mirror"]=$speed
log_info "镜像源 $mirror 下载耗时: ${speed}秒"
done

# 找出最快的镜像源
local best_mirror
local best_speed=999

for mirror in "${!mirror_speeds[@]}"; do
if [ "${mirror_speeds[$mirror]}" -lt "$best_speed" ]; then
best_speed=${mirror_speeds[$mirror]}
best_mirror=$mirror
fi
done

log_info "最佳镜像源: $best_mirror (耗时: ${best_speed}秒)"
echo "$best_mirror"
}

# 应用配置
apply_config() {
local best_mirror=$1
log_info "应用最佳镜像源配置: $best_mirror"

sudo tee /etc/docker/daemon.json > /dev/null <<EOF
{
"data-root": "/vol1/docker",
"insecure-registries": ["127.0.0.1:19827"],
"live-restore": true,
"registry-mirrors": [
"$best_mirror",
"https://registry.hub.docker.com"
],
"max-concurrent-downloads": 10,
"max-concurrent-uploads": 5
}
EOF

sudo systemctl restart docker
sleep 3
}

# 验证配置
verify_config() {
log_info "验证配置是否生效..."
if docker info | grep -q "Registry Mirrors"; then
log_info "镜像源配置成功!"
docker info | grep -A 5 "Registry Mirrors"
else
log_error "镜像源配置失败"
return 1
fi

# 测试下载速度
log_info "测试镜像下载速度..."
time docker pull hello-world >/dev/null 2>&1
docker rmi hello-world >/dev/null 2>&1
}

# 主函数
main() {
check_docker
backup_config

local best_mirror=$(select_best_mirror)
apply_config "$best_mirror"
verify_config

log_info "Docker 镜像源优化完成!"
}

# 执行主函数
main "$@"

📥 使用小雅脚本获取镜像源

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 使用小雅大礼包脚本测试镜像源
bash -c "$(curl --insecure -fsSL https://ddsrem.com/xiaoya_install.sh)"

# 选择菜单选项:
# 输入 9 → 回车
# 输入 6 → 回车
# 脚本会自动测试并推荐最快的镜像源

# 或者直接使用小雅推荐的镜像源
XIAOYA_MIRROR=$(curl -s https://ddsrem.com/xiaoya_mirror.txt)
if [ -n "$XIAOYA_MIRROR" ]; then
echo "使用小雅推荐镜像源: $XIAOYA_MIRROR"
sudo sed -i "s|\"registry-mirrors\":.*|\"registry-mirrors\": [\"$XIAOYA_MIRROR\"]|" /etc/docker/daemon.json
sudo systemctl restart docker
fi

🔍 验证效果

✅ 检查配置状态

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 查看 Docker 信息
docker info

# 检查镜像源配置
docker info | grep -A 10 "Registry Mirrors"

# 查看当前使用的存储驱动
docker info | grep "Storage Driver"

# 检查数据存储路径
docker info | grep "Docker Root Dir"

# 查看容器运行状态
docker ps -a

# 检查镜像列表
docker images

⚡ 速度测试对比

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 创建速度测试脚本
cat > docker-speedtest.sh << 'EOF'
#!/bin/bash
echo "开始Docker镜像下载速度测试..."

# 测试镜像列表
IMAGES=("alpine:latest" "ubuntu:20.04" "nginx:alpine" "hello-world")

for image in "${IMAGES[@]}"; do
echo "测试下载: $image"
start_time=$(date +%s)
docker pull $image > /dev/null 2>&1
end_time=$(date +%s)
duration=$((end_time - start_time))
echo "下载 $image 耗时: ${duration}秒"
docker rmi $image > /dev/null 2>&1
echo "----------------------------------------"
done
EOF

chmod +x docker-speedtest.sh
./docker-speedtest.sh

📊 监控下载状态

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 实时查看下载进度
docker pull ubuntu:20.04

# 查看镜像层信息
docker history ubuntu:20.04

# 检查网络连接
docker run --rm busybox ping -c 4 docker.com

# 监控Docker系统资源使用
docker system df

# 查看Docker磁盘使用详情
docker system df -v

💡 最佳实践

🛡️ 安全建议

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 定期更新 Docker 版本
sudo apt update && sudo apt upgrade docker-ce

# 检查容器安全状态
docker scan ubuntu:20.04

# 监控资源使用情况
docker stats

# 清理无用镜像
docker system prune -a -f

# 检查容器漏洞
docker run --rm aquasec/trivy image ubuntu:20.04

# 使用非root用户运行Docker
sudo groupadd docker
sudo usermod -aG docker $USER
newgrp docker

📈 性能优化配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
{
"max-concurrent-downloads": 10,
"max-concurrent-uploads": 5,
"storage-driver": "overlay2",
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
},
"default-ulimits": {
"nofile": {
"Name": "nofile",
"Hard": 65536,
"Soft": 65536
}
},
"features": {
"buildkit": true
},
"experimental": false,
"debug": false,
"metrics-addr": "127.0.0.1:9323"
}

🔄 定期维护脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 每周清理一次无用资源
0 3 * * 0 docker system prune -af

# 每月检查更新
0 2 1 * * apt update && apt list --upgradable

# 监控磁盘使用
df -h /vol1/docker

# 备份Docker配置
0 2 * * 0 tar -czf /backup/docker-config-$(date +\%Y\%m\%d).tar.gz /etc/docker/

# 检查容器健康状态
0 4 * * * docker ps --filter "health=unhealthy" --format "table {{.Names}}\t{{.Status}}" | mail -s "Unhealthy Docker Containers" admin@example.com

🚨 故障排除

🔍 常见问题解决

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 查看 Docker 日志
sudo journalctl -u docker.service -n 50 --no-pager

# 检查磁盘空间
df -h /vol1/docker/

# 查看Docker存储详情
docker system df -v

# 测试网络连接
docker run --rm busybox nslookup docker.com

# 检查镜像源可达性
curl -I https://docker.mirrors.ustc.edu.cn/v2/

# 重置 Docker 服务
sudo systemctl reset-failed docker

# 清理Docker缓存
docker builder prune

# 检查容器资源限制
docker run --rm --ulimit nofile=1024:1024 alpine ulimit -n

🐛 镜像拉取失败处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 当镜像拉取失败时尝试以下步骤:

# 1. 检查网络连接
ping -c 4 114.114.114.114

# 2. 检查DNS解析
nslookup docker.com

# 3. 尝试使用不同镜像源
sudo sed -i 's|https://docker.mirrors.ustc.edu.cn|https://hub-mirror.c.163.com|' /etc/docker/daemon.json
sudo systemctl restart docker

# 4. 检查防火墙设置
sudo ufw status
sudo iptables -L -n

# 5. 检查Docker代理配置
echo -e "{\n \"proxies\":\n {\n \"default\":\n {\n \"httpProxy\": \"http://proxy.example.com:8080\",\n \"httpsProxy\": \"http://proxy.example.com:8080\"\n }\n }\n}" | sudo tee /etc/docker/proxy.json

# 6. 直接下载镜像文件
curl -LO https://download.docker.com/linux/static/stable/x86_64/docker-20.10.9.tgz

📝 日志分析技巧

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 实时查看Docker日志
sudo journalctl -u docker.service -f

# 查看特定时间段的日志
sudo journalctl -u docker.service --since "2023-01-01" --until "2023-01-02"

# 筛选错误日志
sudo journalctl -u docker.service -p err

# 导出日志到文件
sudo journalctl -u docker.service --since "today" > docker-$(date +%Y%m%d).log

# 使用logrotate管理Docker日志
sudo tee /etc/logrotate.d/docker << 'EOF'
/var/lib/docker/containers/*/*.log {
rotate 7
daily
compress
delaycompress
missingok
copytruncate
}
EOF

🎯 提示: 建议根据实际网络环境选择最适合的镜像源。国内用户优先选择国内镜像源,海外用户可选择国际镜像源。

📚 扩展资源:

🔧 紧急恢复:

1
2
3
4
5
6
7
8
# 如果配置错误,恢复备份
sudo cp /etc/docker/daemon.json.bak /etc/docker/daemon.json
sudo systemctl restart docker

# 完全重置Docker(谨慎使用)
sudo systemctl stop docker
sudo rm -rf /var/lib/docker
sudo systemctl start docker

💡 专业建议:

  1. 使用容器监控工具如 Portainer 或 Docker Scout
  2. 实施镜像签名和验证增强安全性
  3. 使用 Docker Content Trust (DCT) 确保镜像完整性
  4. 定期进行安全扫描和漏洞评估

希望本指南能帮助您优化 FnOS 上的 Docker 性能!🚀