Docker容器安装脚本
·
版本
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 "-----------------------------------------------"
更多推荐
所有评论(0)