生产环境规范部署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"