Docker安装与调优,替换国内镜像源
·
Debian Docker 安装
背景:按照对应步骤安装提示443,猜想可能与GFW牌防火墙相关,记录下换国内镜像安装docker折腾过程
直接安装官方 Docker 可能会因网络问题导致失败,推荐使用以下国内镜像源。这些源经过测试,在 Debian 系统上可用且速度较快(26/1亲测可用,文中源地址可能随时间推移失效,但测速方法不会变,选一个最快替换即可)。


问:把集装箱装鲸鱼身上拢共分几步——
-
测速选源 - 选择最快的国内镜像源
-
环境检测 - 检查系统兼容性和依赖
-
安全验证 - GPG 密钥验证确保软件安全
-
安装配置 - 完整的安装和优化配置
-
验证测试 - 确保安装成功可用
part1:
#!/bin/bash
set -e
echo "=========================================="
echo " 阶段1: 测速选源 + 环境检测"
echo "=========================================="
# 颜色定义
GREEN='\e[32m'
RED='\e[31m'
YELLOW='\e[33m'
BLUE='\e[34m'
NC='\e[0m'
log() { echo -e "${GREEN}[INFO]${NC} $1"; }
step() { echo -e "${BLUE}[STEP]${NC} $1"; }
warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
# 1. 系统信息检测
step "1. 检测系统环境..."
echo "系统: $(lsb_release -ds 2>/dev/null || cat /etc/os-release | grep PRETTY_NAME | cut -d'\"' -f2)"
echo "架构: $(uname -m)"
echo "内核: $(uname -r)"
# 2. 依赖检测
step "2. 检测必要依赖..."
DEPENDENCIES=("curl" "gnupg" "lsb-release" "ca-certificates")
MISSING_DEPS=()
for pkg in "${DEPENDENCIES[@]}"; do
if ! command -v $pkg &> /dev/null && ! dpkg -l | grep -q "^ii $pkg "; then
MISSING_DEPS+=("$pkg")
echo -e "${RED}✗ $pkg 缺失${NC}"
else
echo -e "${GREEN}✓ $pkg 已安装${NC}"
fi
done
if [ ${#MISSING_DEPS[@]} -gt 0 ]; then
step "安装缺失依赖..."
sudo apt update
sudo apt install -y "${MISSING_DEPS[@]}"
fi
# 3. Docker 镜像源测速
step "3. Docker 镜像源测速..."
MIRRORS=(
"docker.mirrors.ustc.edu.cn"
"hub-mirror.c.163.com"
"mirror.baidubce.com"
"registry.docker-cn.com"
)
FASTEST_MIRROR=""
FASTEST_TIME=9999
for mirror in "${MIRRORS[@]}"; do
echo -n "测试 $mirror ... "
start_time=$(date +%s%N)
if curl -s --connect-timeout 5 "https://$mirror/v2/" > /dev/null 2>&1; then
end_time=$(date +%s%N)
duration=$(( (end_time - start_time) / 1000000 ))
if [ $duration -lt $FASTEST_TIME ]; then
FASTEST_TIME=$duration
FASTEST_MIRROR=$mirror
fi
echo -e "${GREEN}${duration}ms${NC}"
else
echo -e "${RED}超时${NC}"
fi
done
# 保存最快镜像源
echo "https://$FASTEST_MIRROR" > /tmp/docker_fastest_mirror.txt
log "最快镜像源: $FASTEST_MIRROR (${FASTEST_TIME}ms)"
# 4. 磁盘和端口检查
step "4. 系统资源检查..."
echo "磁盘空间: $(df -h /var/lib | tail -1 | awk '{print $4 " 可用"}')"
# 检查端口占用
if netstat -tuln | grep -q ":2375 "; then
warn "Docker 端口 2375 被占用"
fi
log "阶段1完成!最快镜像源: $FASTEST_MIRROR"
part2:
#!/bin/bash
set -e
echo "=========================================="
echo " 阶段2: 安全验证 + 安装优化"
echo "=========================================="
# 颜色定义
GREEN='\e[32m'
RED='\e[31m'
YELLOW='\e[33m'
NC='\e[0m'
log() { echo -e "${GREEN}[INFO]${NC} $1"; }
error() { echo -e "${RED}[ERROR]${NC} $1"; exit 1; }
# 1. 读取最快镜像源
FASTEST_MIRROR=$(cat /tmp/docker_fastest_mirror.txt 2>/dev/null || echo "https://docker.mirrors.ustc.edu.cn")
log "使用镜像源: $FASTEST_MIRROR"
# 2. GPG 密钥安全验证
step "1. Docker GPG 密钥安全验证..."
sudo mkdir -p /etc/apt/keyrings
# 下载官方密钥
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
# 验证密钥指纹
EXPECTED_FP="9DC858229FC7DD38854AE2D88D81803C0EBFCD88"
ACTUAL_FP=$(sudo gpg --show-keys /etc/apt/keyrings/docker.gpg 2>/dev/null | grep -A1 "pub" | tail -1 | tr -d ' ')
if [ "$ACTUAL_FP" = "$EXPECTED_FP" ]; then
log "✓ GPG 密钥验证成功"
sudo chmod a+r /etc/apt/keyrings/docker.gpg
else
error "✗ GPG 密钥验证失败"
fi
# 3. 添加软件源
step "2. 添加 Docker 软件源..."
CODENAME=$(lsb_release -cs)
ARCH=$(dpkg --print-architecture)
# 使用国内镜像源
DOCKER_SOURCE="deb [arch=$ARCH signed-by=/etc/apt/keyrings/docker.gpg] $FASTEST_MIRROR/linux/debian $CODENAME stable"
echo "$DOCKER_SOURCE" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
# 4. 安装 Docker
step "3. 安装 Docker Engine..."
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
# 5. 安全配置优化
step "4. 安全配置优化..."
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json << EOF
{
"registry-mirrors": ["$FASTEST_MIRROR"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "3"
},
"data-root": "/var/lib/docker",
"exec-opts": ["native.cgroupdriver=systemd"],
"live-restore": true,
"userland-proxy": false
}
EOF
# 6. 启动服务
step "5. 启动 Docker 服务..."
sudo systemctl enable docker
sudo systemctl daemon-reload
sudo systemctl start docker
# 等待服务启动
sleep 3
if systemctl is-active --quiet docker; then
log "✓ Docker 服务启动成功"
else
error "✗ Docker 服务启动失败"
fi
# 7. 用户权限配置
step "6. 用户权限配置..."
sudo usermod -aG docker $USER
log "✓ 用户已添加到 docker 组"
log "阶段2完成!Docker 安装成功"
part3:
#!/bin/bash
set -e
echo "=========================================="
echo " 阶段3: 验证测速"
echo "=========================================="
# 颜色定义
GREEN='\e[32m'
RED='\e[31m'
YELLOW='\e[33m'
NC='\e[0m'
log() { echo -e "${GREEN}[INFO]${NC} $1"; }
step() { echo -e "${BLUE}[STEP]${NC} $1"; }
# 1. 基础功能验证
step "1. Docker 基础功能验证..."
echo -n "Docker 版本: "
docker --version
echo -n "Docker 服务状态: "
if systemctl is-active --quiet docker; then
echo -e "${GREEN}运行中${NC}"
else
echo -e "${RED}未运行${NC}"
exit 1
fi
# 2. 镜像源配置验证
step "2. 镜像源配置验证..."
echo "当前镜像源配置:"
docker info 2>/dev/null | grep -A 5 "Registry Mirrors" || echo "未找到镜像源配置"
# 3. 权限验证
step "3. 用户权限验证..."
if docker version &> /dev/null; then
log "✓ 非 root 用户权限正常"
else
echo -e "${YELLOW}⚠ 需要重新登录或执行: newgrp docker${NC}"
fi
# 4. 镜像下载速度测试
step "4. 镜像下载速度测试..."
TEST_IMAGES=("alpine:latest" "hello-world:latest" "nginx:alpine")
for image in "${TEST_IMAGES}"; do
echo -n "测试 $image 下载... "
start_time=$(date +%s)
if docker pull $image > /dev/null 2>&1; then
end_time=$(date +%s)
duration=$((end_time - start_time))
# 获取镜像大小
size=$(docker images $image --format "{{.Size}}" 2>/dev/null | head -1)
echo -e "${GREEN}成功 (${duration}s) ${size}${NC}"
# 清理测试镜像
docker rmi $image > /dev/null 2>&1 || true
else
echo -e "${RED}失败${NC}"
fi
done
# 5. 容器运行测试
step "5. 容器运行测试..."
if docker run --rm hello-world | grep -q "Hello from Docker"; then
log "✓ 容器运行测试通过"
else
echo -e "${RED}✗ 容器运行测试失败${NC}"
fi
# 6. 网络连通性测试
step "6. 网络连通性测试..."
if docker run --rm alpine ping -c 2 8.8.8.8 > /dev/null 2>&1; then
log "✓ 容器网络连通性正常"
else
echo -e "${YELLOW}⚠ 容器网络连接可能有问题${NC}"
fi
# 7. 性能基准测试
step "7. 简单性能测试..."
echo -n "容器启动时间: "
start_time=$(date +%s%N)
docker run --rm alpine echo "test" > /dev/null 2>&1
end_time=$(date +%s%N)
duration=$(( (end_time - start_time) / 1000000 ))
echo "${duration}ms"
# 8. 最终验证报告
step "8. 最终验证报告..."
echo "
✅ Docker 版本: $(docker --version 2>/dev/null | cut -d' ' -f3 | tr -d ',')
✅ 服务状态: $(systemctl is-active docker)
✅ 镜像下载: 功能正常
✅ 容器运行: 功能正常
✅ 用户权限: 配置完成
"
log "=========================================="
log "🎉 Docker 安装验证全部完成!"
log "请重新登录或执行: newgrp docker"
log "然后运行: docker run hello-world 测试"
log "=========================================="
更多推荐

所有评论(0)