cat install_docker.sh 
#!/usr/bin/env bash
set -euo pipefail

############################################
# 基础变量
############################################
BASE_DIR="$(cd "$(dirname "$0")" && pwd)"
PKG_DIR="${BASE_DIR}/packages"

DOCKER_TGZ="docker-26.1.4.tgz"
COMPOSE_BIN="docker-compose"

DOCKER_BIN_DIR="/usr/bin"
COMPOSE_INSTALL_PATH="/usr/local/bin/docker-compose"
DOCKER_CONFIG_DIR="/etc/docker"
DAEMON_JSON_URL="https://udong.top/docker/daemon.json"

############################################
# 工具函数
############################################
log()  { echo "[INFO] $*"; }
warn() { echo "[WARN] $*"; }
error(){ echo "[ERROR] $*" >&2; exit 1; }

############################################
# CPU 架构识别
############################################
ARCH="$(uname -m)"
case "${ARCH}" in
    x86_64)
        log "CPU 架构: x86_64"
        ;;
    aarch64|arm64)
        log "CPU 架构: aarch64"
        ;;
    *)
        error "不支持的 CPU 架构: ${ARCH}"
        ;;
esac

############################################
# 卸载模式
############################################
if [[ "${1:-}" == "--uninstall" ]]; then
    log "进入 Docker 卸载模式"

    systemctl stop docker containerd || true
    systemctl disable docker containerd || true

    rm -f /etc/systemd/system/docker.service
    rm -f /etc/systemd/system/containerd.service

    rm -rf /etc/docker
    rm -rf /var/lib/docker
    rm -rf /var/lib/containerd

    rm -f /usr/bin/docker*
    rm -f /usr/bin/containerd*
    rm -f /usr/bin/runc
    rm -f "${COMPOSE_INSTALL_PATH}"

    systemctl daemon-reload

    log "Docker 已完全卸载"
    exit 0
fi

############################################
# 前置检查
############################################
log "开始 Docker 离线安装"

[[ $EUID -eq 0 ]] || error "请使用 root 用户执行"
command -v systemctl >/dev/null || error "系统不支持 systemd"

[[ -f "${PKG_DIR}/${DOCKER_TGZ}" ]] || error "缺少 ${DOCKER_TGZ}"
[[ -f "${PKG_DIR}/${COMPOSE_BIN}" ]] || error "缺少 ${COMPOSE_BIN}"

############################################
# 安装 Docker 二进制
############################################
log "安装 Docker 二进制文件"

if ! command -v docker >/dev/null 2>&1; then
    mkdir -p /opt/docker
    tar -xzf "${PKG_DIR}/${DOCKER_TGZ}" -C /opt/docker
    cp /opt/docker/docker/* "${DOCKER_BIN_DIR}/"
    chmod +x "${DOCKER_BIN_DIR}/docker"*
    chmod +x "${DOCKER_BIN_DIR}/containerd"*
    chmod +x "${DOCKER_BIN_DIR}/runc"
else
    warn "Docker 已存在,跳过二进制安装"
fi

############################################
# systemd 服务配置
############################################
log "配置 systemd 服务"

cat >/etc/systemd/system/containerd.service <<'EOF'
[Unit]
Description=containerd container runtime
After=network.target

[Service]
ExecStartPre=-/sbin/modprobe overlay
ExecStart=/usr/bin/containerd
Restart=always
RestartSec=5
Delegate=yes
KillMode=process
OOMScoreAdjust=-999
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity

[Install]
WantedBy=multi-user.target
EOF

cat >/etc/systemd/system/docker.service <<'EOF'
[Unit]
Description=Docker Application Container Engine
After=network-online.target containerd.service
Wants=network-online.target
Requires=containerd.service

[Service]
Type=notify
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
Restart=always
RestartSec=2
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
Delegate=yes
KillMode=process

[Install]
WantedBy=multi-user.target
EOF

############################################
# daemon.json(远程获取)
############################################
log "配置 Docker 镜像加速(daemon.json)"

mkdir -p "${DOCKER_CONFIG_DIR}"

if command -v curl >/dev/null 2>&1; then
    curl -fsSL "${DAEMON_JSON_URL}" -o "${DOCKER_CONFIG_DIR}/daemon.json"
else
    error "系统未安装 curl,无法获取 daemon.json"
fi

############################################
# 启动服务
############################################
log "启动 Docker 服务"

systemctl daemon-reload
systemctl enable --now containerd
systemctl enable --now docker

systemctl is-active docker >/dev/null || error "Docker 启动失败"

############################################
# 安装 Docker Compose
############################################
log "安装 Docker Compose"

if [[ ! -f "${COMPOSE_INSTALL_PATH}" ]]; then
    cp "${PKG_DIR}/${COMPOSE_BIN}" "${COMPOSE_INSTALL_PATH}"
    chmod +x "${COMPOSE_INSTALL_PATH}"
else
    warn "docker-compose 已存在,跳过安装"
fi

############################################
# 验证
############################################
log "验证 Docker 环境"

docker version
docker-compose version
docker run --rm hello-world

log "Docker 安装完成,daemon.json 来源:${DAEMON_JSON_URL}"

更多推荐