first commit
This commit is contained in:
@@ -0,0 +1,189 @@
|
||||
#!/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 "$@"
|
||||
Reference in New Issue
Block a user