190 lines
5.7 KiB
Bash
190 lines
5.7 KiB
Bash
#!/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 "$@"
|