生产环境规范部署docker

#!/bin/bash

# 定义旧的和新的 Docker 数据目录
old_dir="/var/lib/docker"
new_dir="/data/docker"

# 确保脚本以 root 权限运行
if [ "$(id -u)" != "0" ]; then
   echo "错误:此脚本需要以 root 权限运行。" >&2
   exit 1
fi

# 检查 Docker 是否安装
if ! command -v docker &> /dev/null; then
    echo "错误:Docker 未安装,请先安装 Docker。"
    exit 1
fi

# 停止 Docker 服务
echo "正在停止 Docker 服务..."
systemctl stop docker

# 检查并创建新目录
if [ ! -d "$new_dir" ]; then
    echo "新目录 $new_dir 不存在,正在创建..."
    mkdir -p "$new_dir"
fi

# 移动 Docker 数据目录
echo "正在移动 Docker 数据目录..."
rsync -avzh "$old_dir/" "$new_dir"

# 更新 Docker daemon 配置
echo "正在更新 Docker 配置..."
if [ -f "/etc/docker/daemon.json" ]; then
    # 如果文件存在则添加或更新 data-root 路径
    if grep -q '"data-root"' /etc/docker/daemon.json; then
        # 更新现有的 data-root
        sed -i 's|"data-root": "[^"]*"|"data-root": "'"$new_dir"'"|' /etc/docker/daemon.json
    else
        # 添加新的 data-root,首先判断是否是空的 JSON {}
        if [ $(grep -c . /etc/docker/daemon.json) -eq 1 ] && grep -q '{\s*}' /etc/docker/daemon.json; then
            # 文件只有一行且为空
            sed -i 's|{}|{"data-root": "'"$new_dir"'"}|' /etc/docker/daemon.json
        else
            # 文件不只一行或不为空,需要添加逗号
            sed -i 's|}|, "data-root": "'"$new_dir"'" }|' /etc/docker/daemon.json
        fi
    fi
else
    # 如果 daemon.json 文件不存在,则创建一个
    echo "{\"data-root\": \"$new_dir\"}" > /etc/docker/daemon.json
fi

# 重启 Docker 服务
echo "正在重启 Docker 服务..."
systemctl daemon-reload
systemctl start docker

echo "Docker 数据目录已成功移动到 $new_dir"