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 sudo mkdir -p /etc/dockersudo 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 sudo systemctl restart dockersudo systemctl status dockerdocker 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" , "https://docker.1panel.live" , "https://hub.rat.dev" ] }
🌍 国际镜像源 1 2 3 4 5 6 7 8 { "registry-mirrors" : [ "https://registry.hub.docker.com" , "https://mirror.gcr.io" , "https://quay.io" , "https://ghcr.io" ] }
📊 镜像源速度测试与选择策略 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-reloadsudo systemctl restart dockerdocker info | grep -i "registry\|mirror" docker info | grep -A 20 "Registry Mirrors" sudo systemctl status dockersudo 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 set -eecho "🚀 FnOS Docker 镜像源优化脚本 v1.2.0" echo "==============================================" RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' 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 " } 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) " 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 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' 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 system df docker system df -v
💡 最佳实践 🛡️ 安全建议 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 sudo apt update && sudo apt upgrade docker-cedocker scan ubuntu:20.04 docker stats docker system prune -a -f docker run --rm aquasec/trivy image ubuntu:20.04 sudo groupadd dockersudo 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/docker0 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 sudo journalctl -u docker.service -n 50 --no-pagerdf -h /vol1/docker/docker system df -v docker run --rm busybox nslookup docker.com curl -I https://docker.mirrors.ustc.edu.cn/v2/ sudo systemctl reset-failed dockerdocker 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 ping -c 4 114.114.114.114 nslookup docker.com sudo sed -i 's|https://docker.mirrors.ustc.edu.cn|https://hub-mirror.c.163.com|' /etc/docker/daemon.jsonsudo systemctl restart dockersudo ufw statussudo iptables -L -necho -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.jsoncurl -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 sudo journalctl -u docker.service -fsudo journalctl -u docker.service --since "2023-01-01" --until "2023-01-02" sudo journalctl -u docker.service -p errsudo journalctl -u docker.service --since "today" > docker-$(date +%Y%m%d).log 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.jsonsudo systemctl restart dockersudo systemctl stop dockersudo rm -rf /var/lib/dockersudo systemctl start docker
💡 专业建议 :
使用容器监控工具如 Portainer 或 Docker Scout
实施镜像签名和验证增强安全性
使用 Docker Content Trust (DCT) 确保镜像完整性
定期进行安全扫描和漏洞评估
希望本指南能帮助您优化 FnOS 上的 Docker 性能!🚀