204 lines
5.6 KiB
Bash
204 lines
5.6 KiB
Bash
#!/bin/bash
|
||
set -e
|
||
|
||
echo "=========================================="
|
||
echo " Debian专用 Docker 一键安装脚本"
|
||
echo "=========================================="
|
||
|
||
# 颜色定义
|
||
RED='\033[0;31m'
|
||
GREEN='\033[0;32m'
|
||
YELLOW='\033[1;33m'
|
||
NC='\033[0m'
|
||
|
||
# 日志函数
|
||
log_info() { echo -e "${GREEN}[INFO]${NC} $1"; }
|
||
log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
|
||
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
|
||
|
||
# 检查磁盘空间
|
||
check_disk_space() {
|
||
log_info "检查磁盘空间..."
|
||
local available=$(df / | awk 'NR==2 {print $4}')
|
||
if [ "$available" -lt 1048576 ]; then # 小于1GB
|
||
log_warn "磁盘空间紧张,正在清理..."
|
||
apt-get clean
|
||
rm -rf /var/lib/apt/lists/*
|
||
rm -rf /tmp/*
|
||
journalctl --vacuum-size=50M
|
||
fi
|
||
}
|
||
|
||
# 安装基础依赖(最小化)
|
||
install_minimal_deps() {
|
||
log_info "安装最小化依赖..."
|
||
apt-get update --allow-unauthenticated || {
|
||
log_warn "APT更新失败,继续安装..."
|
||
}
|
||
|
||
apt-get install -y --allow-unauthenticated \
|
||
curl \
|
||
wget \
|
||
gnupg \
|
||
ca-certificates \
|
||
iptables \
|
||
libseccomp2
|
||
}
|
||
|
||
# 彻底清理有问题的docker配置
|
||
clean_docker_config() {
|
||
log_info "清理Docker配置..."
|
||
# 停止docker服务
|
||
systemctl stop docker 2>/dev/null || true
|
||
systemctl stop containerd 2>/dev/null || true
|
||
|
||
# 移除旧配置
|
||
rm -f /etc/apt/sources.list.d/docker.list
|
||
rm -f /etc/apt/sources.list.d/docker.list.save
|
||
rm -rf /var/lib/docker
|
||
}
|
||
|
||
# 下载并安装Docker二进制文件(完全离线方式)
|
||
install_docker_binary() {
|
||
log_info "下载Docker二进制文件..."
|
||
|
||
# 创建安装目录
|
||
INSTALL_DIR="/opt/docker-bin"
|
||
mkdir -p $INSTALL_DIR
|
||
cd $INSTALL_DIR
|
||
|
||
# 下载Docker静态二进制文件(从官方release)
|
||
DOCKER_VERSION="24.0.5"
|
||
log_info "下载Docker $DOCKER_VERSION 静态二进制文件..."
|
||
|
||
# 下载docker cli
|
||
if [ ! -f "docker" ]; then
|
||
wget -O docker https://download.docker.com/linux/static/stable/x86_64/docker-$DOCKER_VERSION.tgz && \
|
||
tar xzvf docker-$DOCKER_VERSION.tgz && \
|
||
cp docker/docker /usr/local/bin/ && \
|
||
chmod +x /usr/local/bin/docker
|
||
fi
|
||
|
||
# 下载docker-compose
|
||
if [ ! -f "docker-compose" ]; then
|
||
DOCKER_COMPOSE_VERSION="2.20.2"
|
||
wget -O /usr/local/bin/docker-compose "https://github.com/docker/compose/releases/download/v$DOCKER_COMPOSE_VERSION/docker-compose-$(uname -s)-$(uname -m)" && \
|
||
chmod +x /usr/local/bin/docker-compose
|
||
fi
|
||
}
|
||
|
||
# 使用官方脚本安装(网络方式)
|
||
install_docker_official() {
|
||
log_info "使用Docker官方脚本安装..."
|
||
|
||
# 下载并运行官方安装脚本
|
||
curl -fsSL https://get.docker.com -o get-docker.sh
|
||
# 修改脚本以跳过空间检查
|
||
sed -i 's/check_space/#check_space/g' get-docker.sh
|
||
sed -i 's/apt_get_update/#apt_get_update/g' get-docker.sh
|
||
|
||
# 运行修改后的脚本
|
||
sh get-docker.sh --version 24.0.5
|
||
|
||
# 如果官方脚本失败,使用备用方法
|
||
if [ $? -ne 0 ]; then
|
||
log_warn "官方脚本安装失败,使用备用方法..."
|
||
install_docker_backup
|
||
fi
|
||
}
|
||
|
||
# 备用安装方法
|
||
install_docker_backup() {
|
||
log_info "使用备用方法安装Docker..."
|
||
|
||
# 直接下载deb包安装
|
||
cd /tmp
|
||
wget https://download.docker.com/linux/debian/dists/bookworm/pool/stable/amd64/docker-ce_24.0.5-1~debian.12~bookworm_amd64.deb
|
||
wget https://download.docker.com/linux/debian/dists/bookworm/pool/stable/amd64/docker-ce-cli_24.0.5-1~debian.12~bookworm_amd64.deb
|
||
wget https://download.docker.com/linux/debian/dists/bookworm/pool/stable/amd64/containerd.io_1.6.21-1_amd64.deb
|
||
|
||
# 安装依赖
|
||
apt-get install -y --allow-unauthenticated \
|
||
libltdl7 \
|
||
pigz \
|
||
iptables
|
||
|
||
# 安装docker包
|
||
dpkg -i containerd.io_1.6.21-1_amd64.deb
|
||
dpkg -i docker-ce-cli_24.0.5-1~debian.12~bookworm_amd64.deb
|
||
dpkg -i docker-ce_24.0.5-1~debian.12~bookworm_amd64.deb
|
||
}
|
||
|
||
# 配置Docker服务
|
||
setup_docker_service() {
|
||
log_info "配置Docker服务..."
|
||
|
||
# 创建docker组
|
||
groupadd docker 2>/dev/null || true
|
||
|
||
# 配置docker daemon
|
||
mkdir -p /etc/docker
|
||
cat > /etc/docker/daemon.json << 'EOF'
|
||
{
|
||
"exec-opts": ["native.cgroupdriver=systemd"],
|
||
"log-driver": "json-file",
|
||
"log-opts": {
|
||
"max-size": "50m",
|
||
"max-file": "3"
|
||
},
|
||
"storage-driver": "overlay2",
|
||
"data-root": "/var/lib/docker"
|
||
}
|
||
EOF
|
||
|
||
# 启动服务
|
||
systemctl enable docker
|
||
systemctl start docker
|
||
|
||
# 等待服务启动
|
||
sleep 3
|
||
}
|
||
|
||
# 验证安装
|
||
verify_installation() {
|
||
log_info "验证安装..."
|
||
|
||
if command -v docker &> /dev/null; then
|
||
docker --version
|
||
log_info "✅ Docker安装成功!"
|
||
else
|
||
log_error "❌ Docker安装失败"
|
||
return 1
|
||
fi
|
||
|
||
# 测试docker服务
|
||
if systemctl is-active docker &> /dev/null; then
|
||
log_info "✅ Docker服务运行正常"
|
||
else
|
||
log_warn "⚠️ Docker服务未运行,尝试启动..."
|
||
systemctl start docker
|
||
fi
|
||
}
|
||
|
||
# 主函数
|
||
main() {
|
||
log_info "开始Docker安装流程..."
|
||
|
||
check_disk_space
|
||
clean_docker_config
|
||
install_minimal_deps
|
||
install_docker_official
|
||
setup_docker_service
|
||
verify_installation
|
||
|
||
log_info "🎉 Docker安装完成!"
|
||
echo ""
|
||
echo "使用说明:"
|
||
echo " docker --version # 查看版本"
|
||
echo " systemctl status docker # 查看服务状态"
|
||
echo " usermod -aG docker \$USER # 添加用户到docker组"
|
||
}
|
||
|
||
# 执行主函数
|
||
main "$@"
|