You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

195 lines
4.9 KiB

#!/bin/bash
set -e
DOCKER_TGZ="docker.tgz"
COMPOSE_BIN="docker-compose"
INSTALL_DIR="/usr/bin"
SYSTEMD_DIR="/etc/systemd/system"
DAEMON_JSON="/etc/docker/daemon.json"
# ===============================
# 多个镜像加速器 (按需修改)
# ===============================
REGISTRY_MIRRORS=(
"https://docker-cf.registry.cyou"
"https://docker.registry.cyou"
"https://hub.uuuadc.top"
"https://docker.anyhub.us.kg"
"https://dockerhub.jobcher.com"
"https://dockerhub.icu"
"https://docker.ckyl.me"
"https://docker.awsl9527.cn"
"https://docker.rainbond.cc"
"https://docker.1panel.live"
"https://docker.1ms.run"
"https://hub.rat.dev"
"https://docker.jsdelivr.fyi"
"https://dockerpull.com"
"https://dockerproxy.cn"
"https://docker.m.daocloud.io"
"https://hub.gog.email"
"https://7dg5h62m.mirror.aliyuncs.com"
"https://registry.cn-hangzhou.aliyuncs.com"
"https://dockerhub.azk8s.cn",
"https://hub-mirror.c.163.com"
"https://mirrors.ustc.edu.cn"
"https://hub.c.163.com"
)
echo "=== Docker Offline Installer (Full Version) ==="
###############################################
# 函数:卸载旧 Docker
###############################################
uninstall_old_docker() {
echo "------ 开始卸载旧 Docker ------"
# systemd 停止服务
systemctl stop docker >/dev/null 2>&1 || true
systemctl stop docker.socket >/dev/null 2>&1 || true
# 删除二进制
rm -f /usr/bin/docker
rm -f /usr/bin/dockerd
rm -f /usr/bin/containerd
rm -f /usr/bin/runc
rm -f /usr/local/bin/docker-compose
# 针对 rpm 系统(CentOS / RHEL)
if command -v rpm >/dev/null 2>&1; then
rpm -qa | grep -E "docker|containerd" | xargs -r rpm -e --nodeps
fi
# 针对 deb 系统(Ubuntu / Debian)
if command -v dpkg >/dev/null 2>&1; then
apt-get remove -y docker docker-engine docker.io containerd runc >/dev/null 2>&1 || true
fi
echo "------ 卸载旧 Docker 完成 ------"
}
###############################################
# 执行卸载
###############################################
uninstall_old_docker
###############################################
# 安装 Docker
###############################################
echo "1) 安装 Docker 二进制程序..."
if [ ! -f "$DOCKER_TGZ" ]; then
echo "[ERROR] 未找到 docker.tgz,请放在当前目录"
exit 1
fi
tar -xf $DOCKER_TGZ
cd docker
cp docker* $INSTALL_DIR/
[ -f "containerd" ] && cp containerd $INSTALL_DIR/
[ -f "runc" ] && cp runc $INSTALL_DIR/
cd ..
###############################################
# 创建 systemd 服务
###############################################
echo "2) 创建 systemd 服务文件..."
cat > $SYSTEMD_DIR/docker.service <<EOF
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network.target
[Service]
Type=notify
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP \\$MAINPID
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TimeoutStartSec=0
Restart=always
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
###############################################
# 配置 daemon.json(支持多个 registry mirrors)
###############################################
echo "3) 配置 daemon.json (支持多个 registry mirrors)..."
mkdir -p /etc/docker
# 生成 JSON 数组字符串
MIRROR_JSON=""
for m in "${REGISTRY_MIRRORS[@]}"; do
if [ -z "$MIRROR_JSON" ]; then
MIRROR_JSON="\"$m\""
else
MIRROR_JSON="$MIRROR_JSON, \"$m\""
fi
done
if [ ! -f "$DAEMON_JSON" ]; then
echo "[INFO] daemon.json 不存在,正在创建..."
cat > $DAEMON_JSON <<EOF
{
"registry-mirrors": [ $MIRROR_JSON ]
}
EOF
else
echo "[INFO] daemon.json 已存在,正在合并 registry-mirrors ..."
if grep -q "registry-mirrors" "$DAEMON_JSON"; then
sed -i "s#\"registry-mirrors\": \[[^]]*\]#\"registry-mirrors\": [ $MIRROR_JSON ]#" "$DAEMON_JSON"
else
sed -i "s#^{#{\n \"registry-mirrors\": [ $MIRROR_JSON ],#" "$DAEMON_JSON"
fi
fi
echo "daemon.json 当前内容:"
cat $DAEMON_JSON
###############################################
# 启动 Docker
###############################################
echo "4) 启动 Docker 服务..."
systemctl enable docker
systemctl restart docker
###############################################
# 安装 docker-compose
###############################################
echo "5) 安装 docker-compose..."
if [ ! -f "$COMPOSE_BIN" ]; then
echo "[ERROR] 未找到 docker-compose 文件"
exit 1
fi
cp $COMPOSE_BIN /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
###############################################
# 验证安装
###############################################
echo "6) 验证安装..."
echo -n "Docker 版本: "
docker --version || echo "Docker 未正确安装"
echo -n "Compose 版本: "
docker-compose --version || echo "Compose 未正确安装"
echo "=== Docker 离线安装(含自动卸载旧版本 + 多镜像加速)完成 ==="