Debian Docker 安装

背景:按照对应步骤安装提示443,猜想可能与GFW牌防火墙相关,记录下换国内镜像安装docker折腾过程

        直接安装官方 Docker 可能会因网络问题导致失败,推荐使用以下国内镜像源。这些源经过测试,在 Debian 系统上可用且速度较快(26/1亲测可用,文中源地址可能随时间推移失效,但测速方法不会变,选一个最快替换即可)。

问:把集装箱装鲸鱼身上拢共分几步——
  1. 测速选源​ - 选择最快的国内镜像源
  2. 环境检测​ - 检查系统兼容性和依赖
  3. 安全验证​ - GPG 密钥验证确保软件安全
  4. 安装配置​ - 完整的安装和优化配置
  5. 验证测试​ - 确保安装成功可用

        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 "=========================================="

更多推荐