版本

docker v25.0.0

#!/bin/bash

# =================================================================
# 脚本名称: install_docker_offline.sh
# 适用版本: Docker 25.0.0+ (基于 2025 精简版文档)
# =================================================================

set -e  # 遇到错误立即停止执行

# --- 变量定义 ---
DOCKER_TGZ="docker-25.0.0.tgz"         # 离线包文件名 
BINARY_DIR="/usr/bin"                  # 二进制文件存放路径 
DATA_ROOT="/data/docker"               # Docker 数据根目录 
SYSTEMD_PATH="/usr/lib/systemd/system" # Systemd 脚本路径 

# --- 1. 权限与环境检查 ---
if [ "$EUID" -ne 0 ]; then 
    echo "错误: 请以 root 权限运行此脚本。"
    exit 1
fi

if [ ! -f "$DOCKER_TGZ" ]; then
    echo "错误: 未找到离线包 $DOCKER_TGZ,请确保文件在当前目录下。" 
    exit 1
fi

echo ">>> 开始离线安装 Docker..."

# --- 2. 基础配置 ---
echo ">>> 添加 docker 用户组..."
groupadd docker || true 

echo ">>> 创建数据目录: $DATA_ROOT"
mkdir -p "$DATA_ROOT" 

# --- 3. 部署二进制文件 ---
echo ">>> 解压并部署二进制文件到 $BINARY_DIR..." 
tar xzvf "$DOCKER_TGZ" 
# 使用 cp -vr 确保覆盖并显示过程 [cite: 50]
cp -vr docker/* "$BINARY_DIR/" 

# docker-compose命令
chmod 744 docker-compose
cp -vr docker-compose "$BINARY_DIR/"

# --- 4. 生成 Systemd 配置文件 ---

echo ">>> 创建 docker.socket..." 
cat > ${SYSTEMD_PATH}/docker.socket << EOF
[Unit]
Description=Docker Socket for the API

[Socket]
ListenStream=/var/run/docker.sock
SocketMode=0660
SocketUser=root
SocketGroup=root

[Install]
WantedBy=sockets.target
EOF

echo ">>> 创建 containerd.service..." 
cat > ${SYSTEMD_PATH}/containerd.service << EOF
[Unit]
Description=containerd container runtime
Documentation=https://containerd.io
After=network.target local-fs.target

[Service]
ExecStartPre=-/sbin/modprobe overlay
ExecStart=${BINARY_DIR}/containerd
Type=notify
Delegate=yes
KillMode=process
Restart=always
RestartSec=5
LimitNPROC=infinity
LimitCORE=infinity
LimitNOFILE=1048576
TasksMax=infinity
OOMScoreAdjust=-999

[Install]
WantedBy=multi-user.target
EOF

echo ">>> 创建 docker.service..." 
cat > ${SYSTEMD_PATH}/docker.service << EOF
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service containerd.service
Wants=network-online.target
Requires=docker.socket containerd.service

[Service]
Type=notify
# 使用 --data-root 指定存储路径,解决旧版本 --graph 报错问题 [cite: 228, 355, 465]
ExecStart=${BINARY_DIR}/dockerd --data-root=${DATA_ROOT} -H fd:// --containerd=/run/containerd/containerd.sock
ExecReload=/bin/kill -s HUP \$MAINPID
TimeoutSec=0
RestartSec=2
Restart=always
StartLimitBurst=3
StartLimitInterval=60s
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
Delegate=yes
KillMode=process
OOMScoreAdjust=-500

[Install]
WantedBy=multi-user.target
EOF

# --- 5. 加载并启动服务 ---
echo ">>> 加载并启动 Docker 服务..."
systemctl daemon-reload 
systemctl enable containerd.service
systemctl enable docker.socket
systemctl enable docker.service 

systemctl start docker 

# --- 6. 最终验证 ---
echo "-----------------------------------------------"
echo ">>> 安装完成,正在验证状态:"
docker -v 
echo "服务状态: $(systemctl is-active docker)" 
echo "数据目录: $(docker info 2>/dev/null | grep "Docker Root Dir")" 
echo "-----------------------------------------------"

更多推荐