Files
virtualbox_client/resources/deploy_docker.sh
T

190 lines
5.7 KiB
Bash
Raw Normal View History

2026-05-10 10:56:52 +08:00
#!/bin/bash
#
# deploy_docker.sh - Docker 一键部署脚本
# 适用系统: Ubuntu 20.04 (Focal)
# 功能: 安装 Docker Engine 并配置国内镜像加速器
#
set -e
# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
log_info() { echo -e "${GREEN}[INFO]${NC} $1"; }
log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
# 检查是否以 root 运行
check_root() {
if [ "$EUID" -ne 0 ]; then
log_warn "未以 root 身份运行,将使用 sudo 提权"
SUDO="sudo"
else
SUDO=""
fi
}
# 步骤1: 清理旧 Docker 仓库配置(避免残余配置干扰)
cleanup_old_repo() {
log_info "步骤1: 清理旧 Docker 仓库配置..."
# 移除所有旧的 docker 源文件
$SUDO rm -f /etc/apt/sources.list.d/docker.list /etc/apt/sources.list.d/docker*.list
# 移除旧的 docker gpg 密钥
$SUDO rm -f /usr/share/keyrings/docker-archive-keyring.gpg
$SUDO apt-key del "7EA0A9C3F273FCD8" 2>/dev/null || true
log_info "旧 Docker 仓库配置已清理"
}
# 步骤2: 添加 Docker 官方 GPG 密钥(使用阿里云镜像)
add_gpg_key() {
log_info "步骤2: 添加 Docker GPG 密钥..."
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg -o /tmp/docker.gpg
# 安装到 keyrings 目录(供 signed-by 使用)
$SUDO mkdir -p /usr/share/keyrings
$SUDO gpg --batch --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg /tmp/docker.gpg 2>/dev/null || true
# 用 apt-key 添加(传统方式兼容)
$SUDO apt-key add /tmp/docker.gpg
rm -f /tmp/docker.gpg
log_info "GPG 密钥添加完成"
}
# 步骤3: 添加 Docker APT 源(使用阿里云镜像,带 signed-by 引用)
add_docker_repo() {
log_info "步骤3: 添加 Docker APT 源..."
# 使用 signed-by 添加(指定密钥文件路径,避免 NO_PUBKEY 错误)
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable" | $SUDO tee /etc/apt/sources.list.d/docker.list > /dev/null
log_info "Docker APT 源添加完成"
}
# 步骤4: 更新 apt 并安装依赖(此时 Docker 源已配置好密钥)
install_dependencies() {
log_info "步骤4: 更新 apt 包索引并安装依赖..."
$SUDO apt update -y
$SUDO apt install -y \
apt-transport-https \
ca-certificates \
curl \
gnupg \
lsb-release
log_info "依赖安装完成"
}
# 步骤5: 安装 Docker Engine
install_docker() {
log_info "步骤5: 安装 Docker Engine(先装核心组件,再试可选组件)..."
# 核心组件(必须成功)
$SUDO apt install -y docker-ce docker-ce-cli containerd.io || {
log_error "Docker 核心组件安装失败!"
exit 1
}
# 可选组件(失败不影响核心功能)
for pkg in docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras; do
if $SUDO apt install -y "$pkg" 2>/dev/null; then
log_info "✔ $pkg 安装成功"
else
log_warn "$pkg 安装失败(可选组件,可跳过)"
fi
done
log_info "Docker Engine 安装完成"
}
# 步骤6: 配置 Docker 镜像加速器
configure_mirrors() {
log_info "步骤6: 配置 Docker 镜像加速器..."
$SUDO mkdir -p /etc/docker
cat > /tmp/daemon.json << 'EOF'
{
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://dockerproxy.com",
"https://docker.nju.edu.cn",
"https://docker.mirrors.ustc.edu.cn"
]
}
EOF
$SUDO cp /tmp/daemon.json /etc/docker/daemon.json
rm -f /tmp/daemon.json
log_info "镜像加速器配置完成"
}
# 步骤7: 重启 Docker 服务
restart_docker() {
log_info "步骤7: 重启 Docker 服务..."
$SUDO systemctl restart docker
log_info "Docker 服务已重启"
}
# 步骤8: 验证安装
verify_installation() {
log_info "步骤8: 验证安装..."
# 检查 Docker 版本
if docker --version &>/dev/null; then
log_info "$(docker --version)"
else
log_error "Docker 未正确安装"
exit 1
fi
# 检查 Docker 服务状态
if $SUDO systemctl is-active docker &>/dev/null; then
log_info "Docker 服务运行正常"
else
log_error "Docker 服务未运行"
exit 1
fi
# 检查镜像加速器
if $SUDO docker info 2>/dev/null | grep -q "Registry Mirrors"; then
log_info "镜像加速器配置如下:"
$SUDO docker info 2>/dev/null | grep -A5 "Registry Mirrors"
fi
# 运行 hello-world 测试
log_info "运行 hello-world 测试..."
if $SUDO docker run --rm hello-world &>/dev/null; then
log_info "Docker 安装验证通过!"
else
log_warn "hello-world 测试未通过,请检查网络连接"
fi
}
# 主函数
main() {
echo "=========================================="
echo " Docker 一键部署脚本"
echo " 适用系统: Ubuntu 20.04"
echo "=========================================="
echo ""
check_root
cleanup_old_repo
add_gpg_key
add_docker_repo
install_dependencies
install_docker
configure_mirrors
restart_docker
verify_installation
echo ""
echo "=========================================="
echo -e "${GREEN} Docker 部署完成!${NC}"
echo "=========================================="
echo ""
echo "常用命令:"
echo " docker ps - 查看运行中的容器"
echo " docker images - 查看本地镜像"
echo " docker info - 查看 Docker 信息"
echo " docker run hello-world - 测试 Docker 安装"
echo ""
}
main "$@"