em-script/scripts/packages/install_docker.sh

332 lines
7.7 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
# Debian 12 Docker 安装脚本 (使用国内源)
# 从国内镜像源安装 Docker CE
set -e
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'
# 日志函数
log_info() {
echo -e "${BLUE}[INFO]${NC} $1"
}
log_success() {
echo -e "${GREEN}[SUCCESS]${NC} $1"
}
log_warning() {
echo -e "${YELLOW}[WARNING]${NC} $1"
}
log_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
# 检查系统要求
check_system() {
log_info "检查系统要求..."
# 检查是否为 Debian 系统
if ! command -v lsb_release &> /dev/null; then
apt update && apt install -y lsb-release
fi
local distro=$(lsb_release -si)
local version=$(lsb_release -sr)
if [[ "$distro" != "Debian" ]]; then
log_error "此脚本仅支持 Debian 系统"
exit 1
fi
if [[ "${version%%.*}" -lt 10 ]]; then
log_error "此脚本需要 Debian 10 或更高版本"
exit 1
fi
# 检查架构
local arch=$(dpkg --print-architecture)
if [[ "$arch" != "amd64" && "$arch" != "arm64" ]]; then
log_error "不支持的架构: $arch"
exit 1
fi
log_success "系统检查通过: $distro $version ($arch)"
}
# 卸载旧版本
uninstall_old_versions() {
log_info "卸载可能存在的旧版本 Docker..."
# 停止所有运行中的容器
if command -v docker &> /dev/null; then
docker stop $(docker ps -aq) 2>/dev/null || true
fi
# 卸载旧版本
apt remove -y docker docker-engine docker.io containerd runc docker-compose 2>/dev/null || true
# 清理相关文件
rm -rf /var/lib/docker /etc/docker
rm -f /etc/apt/sources.list.d/docker.list
rm -f /etc/apt/keyrings/docker.gpg
log_success "旧版本清理完成"
}
# 安装依赖包
install_dependencies() {
log_info "安装依赖包..."
apt update
apt install -y \
ca-certificates \
curl \
gnupg \
lsb-release \
apt-transport-https \
software-properties-common
log_success "依赖包安装完成"
}
# 添加 Docker 仓库
add_docker_repository() {
log_info "添加 Docker 仓库 (使用清华大学镜像源)..."
# 创建密钥目录
mkdir -p /etc/apt/keyrings
# 下载并添加 GPG 密钥
curl -fsSL https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/debian/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
# 添加仓库
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/debian $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
log_success "Docker 仓库添加完成"
}
# 安装 Docker
install_docker() {
log_info "安装 Docker CE..."
# 更新包索引
apt update
# 安装 Docker CE
apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
log_success "Docker CE 安装完成"
}
# 配置 Docker
configure_docker() {
log_info "配置 Docker..."
# 创建配置目录
mkdir -p /etc/docker
# 配置 daemon.json
cat > /etc/docker/daemon.json << 'EOF'
{
"registry-mirrors": [
"https://registry.docker-cn.com",
"https://docker.mirrors.ustc.edu.cn",
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com"
],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "3"
},
"storage-driver": "overlay2",
"exec-opts": ["native.cgroupdriver=systemd"],
"iptables": false
}
EOF
# 配置 containerd
mkdir -p /etc/containerd
containerd config default | tee /etc/containerd/config.toml > /dev/null
# 重新加载配置
systemctl daemon-reload
log_success "Docker 配置完成"
}
# 启动服务
start_services() {
log_info "启动 Docker 服务..."
# 启动服务
systemctl enable docker
systemctl enable containerd
systemctl start docker
systemctl start containerd
# 等待服务启动
sleep 2
# 检查服务状态
if systemctl is-active --quiet docker; then
log_success "Docker 服务启动成功"
else
log_error "Docker 服务启动失败"
journalctl -u docker --no-pager -n 20
exit 1
fi
}
# 配置用户权限
configure_user_permissions() {
log_info "配置用户权限..."
# 获取当前用户
local current_user=""
if [[ -n "$SUDO_USER" ]]; then
current_user="$SUDO_USER"
elif [[ -n "$USER" && "$USER" != "root" ]]; then
current_user="$USER"
fi
if [[ -n "$current_user" ]]; then
# 检查用户是否存在
if id "$current_user" &>/dev/null; then
usermod -aG docker "$current_user"
log_success "已将用户 $current_user 添加到 docker 组"
log_warning "请重新登录或运行 'newgrp docker' 以使权限生效"
fi
fi
}
# 测试安装
test_installation() {
log_info "测试 Docker 安装..."
# 检查版本
local docker_version=$(docker --version)
local docker_compose_version=$(docker compose version 2>/dev/null || echo "docker-compose plugin")
log_success "Docker 版本: $docker_version"
log_info "Docker Compose: $docker_compose_version"
# 运行测试容器
log_info "运行测试容器..."
if docker run --rm hello-world >/dev/null 2>&1; then
log_success "Docker 测试通过!"
else
log_warning "Docker 运行测试失败,但安装可能成功。请检查网络连接。"
fi
# 显示使用信息
cat << 'EOF'
Docker 安装完成!
常用命令:
docker --version # 查看版本
docker run hello-world # 运行测试容器
docker ps -a # 查看所有容器
docker images # 查看镜像
docker pull <image> # 拉取镜像
docker build -t <name> . # 构建镜像
服务管理:
sudo systemctl start docker # 启动服务
sudo systemctl stop docker # 停止服务
sudo systemctl restart docker # 重启服务
配置说明:
- 已配置国内镜像加速器
- 日志轮转已配置 (最大100M保留3个文件)
- 使用 overlay2 存储驱动
- 已启用 systemd cgroup 驱动
EOF
}
# 显示帮助信息
show_help() {
cat << EOF
Debian 12 Docker 安装脚本
此脚本将从清华大学镜像源安装 Docker CE并配置国内镜像加速器。
用法: $0 [选项]
选项:
-h, --help 显示此帮助信息
-f, --force 强制重新安装(不检查现有安装)
示例:
$0 # 正常安装
$0 --force # 强制重新安装
EOF
}
# 主函数
main() {
local force_install=false
# 解析参数
while [[ $# -gt 0 ]]; do
case $1 in
-h|--help)
show_help
exit 0
;;
-f|--force)
force_install=true
shift
;;
*)
log_error "未知选项: $1"
show_help
exit 1
;;
esac
done
# 检查是否为 root 用户
if [[ $EUID -ne 0 ]]; then
log_error "请使用 root 用户或 sudo 运行此脚本"
exit 1
fi
# 检查是否已安装
if command -v docker &> /dev/null && [[ "$force_install" != true ]]; then
log_warning "Docker 已经安装。如需重新安装,请使用 --force 选项。"
docker --version
exit 0
fi
log_info "开始安装 Docker CE..."
echo
check_system
uninstall_old_versions
install_dependencies
add_docker_repository
install_docker
configure_docker
start_services
configure_user_permissions
test_installation
echo
log_success "Docker 安装完成!"
}
# 执行主函数
main "$@"