harbor以及docker镜像迁移记录
1. MinIO 故障与版本处理
1.1 现象
-
MinIO 页面出现
The specified bucket does not exist -
登录后左侧只有简化菜单
1.2 处理过程
-
清理 MinIO 数据并重启:
cd /root/minio docker compose down rm -rf /data/minio/data /data/minio/config mkdir -p /data/minio/data /data/minio/config docker compose up -d docker compose ps
-
验证账号(来自
docker-compose.yml):-
用户名:
minioadmin -
密码:
minioadmin
-
-
检查并修复
docker-compose.yml格式问题(缩进、异常空格、healthcheck 同行错误)。 -
补全缺失网络定义:
networks: minio_net: driver: bridge
-
验证配置:
cd /root/minio docker compose config
1.3 MinIO 版本切换
-
已切换到旧版:
-
quay.io/minio/minio:RELEASE.2024-07-16T23-46-41Z
-
-
启动命令:
cd /root/minio docker compose up -d docker exec minio minio --version
-
回退时遇到数据格式不兼容:
-
报错:
decodeXLHeaders: Unknown xl meta version 3 -
处理:清空
/root/minio/data后重启。
-
2. Nginx 代理/重定向检查
2.1 关键链路
-
80 -> 443 -> 9444 -> 9001 -
MinIO Console 最终走
9001
2.2 已确认配置
-
/etc/nginx/conf.d/minio-http-redirect.conf-
return 301 https://$host$request_uri;
-
-
/etc/nginx/conf.d/minio-443.conf-
proxy_pass https://127.0.0.1:9444;
-
-
/etc/nginx/conf.d/minio.conf-
proxy_pass http://127.0.0.1:9001;
-
2.3 验证命令
curl -k -I -H 'Host: minio.apotos.com' http://127.0.0.1/ curl -k -I -H 'Host: minio.apotos.com' https://127.0.0.1/ curl -k -I -H 'Host: minio.apotos.com' https://127.0.0.1:9444/
2.4 输出示例与关键字
HTTP/1.1 301 Moved Permanently Location: https://minio.apotos.com/ HTTP/2 200
-
301 Moved Permanently:HTTP 到 HTTPS 的永久重定向,正常。 -
Location:重定向目标地址。 -
200:请求成功,表示链路可达。
3. MinIO CA 证书导出
3.1 导出命令
mkdir -p /root/minio/certs
openssl s_client -showcerts -servername minio.apotos.com -connect 127.0.0.1:443 </dev/null 2>/dev/null \
| awk '/BEGIN CERTIFICATE/{flag=1;f=sprintf("/root/minio/certs/chain-%02d.crt",++i)} flag{print > f} /END CERTIFICATE/{flag=0}'
cp /root/minio/certs/chain-01.crt /root/minio/certs/minio-ca.crt
openssl x509 -in /root/minio/certs/minio-ca.crt -noout -fingerprint -sha256
3.2 输出文件
-
/root/minio/certs/minio-ca.crt
4. 磁盘空间诊断
4.1 总体结果(当时采集)
-
根分区
/:63G总,50G已用,9.9G可用,84% -
/home:29G可用(最空) -
inode 使用率:
8%(正常)
4.2 主要占用目录
-
/data:36G-
/data/harbor:23G(registry 为主) -
/data/k8s_data:13G
-
-
/var/lib/docker:7.5G -
Docker 可回收镜像:约
5.13G
4.3 诊断命令
df -hT df -i du -xh --max-depth=1 / | sort -h du -xh --max-depth=2 /data | sort -h du -xh --max-depth=2 /var | sort -h docker system df
4.4 输出示例与关键字
/dev/mapper/openeuler-root ext4 63G 50G 9.9G 84% / /dev/mapper/openeuler-home ext4 31G 24K 29G 1% /home /dev/sdb1 ext4 196G 32G 155G 17% /data2 TYPE TOTAL ACTIVE SIZE RECLAIMABLE Images 33 12 7.07GB 5.133GB (72%)
-
已用%:分区使用率,超过80%需重点关注。 -
RECLAIMABLE:可回收空间(如未使用镜像/构建缓存)。 -
Images:本地镜像体积,不等于容器实际写入数据体积。
5. 新磁盘 /dev/sdb 分区与格式化
5.1 初始状态
-
/dev/sdb:200G,未分区未挂载
5.2 操作命令(整盘单分区)
parted -s /dev/sdb mklabel gpt parted -s /dev/sdb mkpart primary ext4 0% 100% partprobe /dev/sdb lsblk -f /dev/sdb
5.3 格式化、挂载、开机自动挂载
mkfs.ext4 -F /dev/sdb1 mkdir -p /data2 mount /dev/sdb1 /data2 UUID=$(blkid -s UUID -o value /dev/sdb1) grep -q "UUID=$UUID /data2 ext4 defaults,nofail 0 2" /etc/fstab || \ echo "UUID=$UUID /data2 ext4 defaults,nofail 0 2" >> /etc/fstab mount -a df -h | grep /data2
5.4 结果
-
/data2可用约186G
5.5 输出示例与关键字
NAME FSTYPE FSVER LABEL UUID FSAVAIL FSUSE% MOUNTPOINTS sdb └─sdb1 /dev/sdb1 196G 28K 186G 1% /data2
-
FSTYPE:文件系统类型(如ext4)。 -
UUID:分区唯一标识,写入fstab比设备名更稳定。 -
MOUNTPOINTS:分区当前挂载点。
6. Harbor 全量迁移(含镜像)
6.1 目标
-
将
/data/harbor全量迁到/data2/harbor -
保持 Harbor 原路径不变(通过 bind mount)
6.2 实际执行
cd /root/harbor docker compose down mkdir -p /data2/harbor cp -a /data/harbor/. /data2/harbor/ BAK=/data/harbor.bak_$(date +%F_%H%M%S) mv /data/harbor "$BAK" mkdir -p /data/harbor mount --bind /data2/harbor /data/harbor grep -q '^/data2/harbor /data/harbor none bind 0 0$' /etc/fstab || \ echo '/data2/harbor /data/harbor none bind 0 0' >> /etc/fstab docker compose up -d docker compose ps
6.3 验证
mount | grep ' /data/harbor ' df -h | grep -E '/data2|/data/harbor' du -sh /data2/harbor /data/harbor.bak_2026-03-02_185128
6.4 结果
-
/data/harbor已绑定到新盘(/dev/sdb1) -
/data2/harbor与备份目录体积一致(23G) -
Harbor 容器已拉起
6.6 输出示例与关键字
/dev/sdb1 on /data/harbor type ext4 (rw,relatime) 23G /data2/harbor 23G /data/harbor.bak_2026-03-02_185128
-
mount --bind:把新路径“映射”为旧路径,业务配置可不改。 -
rw:读写挂载。 -
relatime:访问时间优化挂载参数。 -
迁移校验重点:新目录与备份目录体积接近/一致。
6.5 清理备份(确认业务正常后)
rm -rf /data/harbor.bak_2026-03-02_185128
7. 备份与恢复命令(汇总)
7.1 备份
TS=$(date +%F_%H%M%S) mkdir -p /root/backup/minio_$TS tar -C /root -czf /root/backup/minio_$TS/minio_data.tgz minio/data tar -C /root -czf /root/backup/minio_$TS/minio_compose.tgz minio/docker-compose.yml minio/certs tar -czf /root/backup/minio_$TS/nginx_minio_conf.tgz \ /etc/nginx/conf.d/minio.conf \ /etc/nginx/conf.d/minio-443.conf \ /etc/nginx/conf.d/minio-http-redirect.conf \ /etc/nginx/ssl/_.apotos.com.crt \ /etc/nginx/ssl/_.apotos.com.key ls -lh /root/backup/minio_$TS sha256sum /root/backup/minio_$TS/*.tgz
7.2 恢复
cd /root/minio && docker compose down tar -C / -xzf /root/backup/<备份目录>/minio_data.tgz tar -C / -xzf /root/backup/<备份目录>/minio_compose.tgz tar -C / -xzf /root/backup/<备份目录>/nginx_minio_conf.tgz nginx -t && systemctl reload nginx cd /root/minio && docker compose up -d
8. Docker 数据目录迁移到 /data2
8.1 目标
-
将 Docker 数据根目录从
/var/lib/docker迁移到/data2/docker -
释放根分区空间
8.2 迁移前检查
docker info --format '{{.DockerRootDir}}'
docker ps --format '{{.Names}}' | wc -l
cat /etc/docker/daemon.json
df -h / /data2
8.3 执行过程
# 停止 Docker 相关服务
systemctl stop docker
systemctl stop containerd
systemctl stop docker.socket
# 复制数据到新目录
mkdir -p /data2/docker
cp -a /var/lib/docker/. /data2/docker/
# 备份并更新 daemon 配置
cp -a /etc/docker/daemon.json /etc/docker/daemon.json.bak_$(date +%F_%H%M%S)
python3 - <<'PY'
import json
p='/etc/docker/daemon.json'
with open(p,'r',encoding='utf-8') as f:
d=json.load(f)
d['data-root']='/data2/docker'
with open(p,'w',encoding='utf-8') as f:
json.dump(d,f,ensure_ascii=False,indent=2)
f.write('\n')
PY
# 启动服务
systemctl daemon-reload
systemctl start containerd
systemctl start docker
8.4 清理旧目录残留挂载并释放空间
# 如果旧目录有 overlay 残留挂载,先停服务并卸载
systemctl stop docker.socket docker containerd
for m in $(mount | awk '/\/var\/lib\/docker\/overlay2\/.*\/merged/{print $3}'); do
umount -l "$m" || true
done
# 清理旧目录后重启 Docker
rm -rf /var/lib/docker/*
systemctl start containerd docker
8.5 验证结果
docker info --format '{{.DockerRootDir}}'
du -sh /var/lib/docker /data2/docker
df -h / /data2
docker ps --format '{{.Names}}'
8.6 本次结果
-
Docker Root Dir:
/data2/docker -
/var/lib/docker:4.0K -
/data2/docker:约9.4G -
根分区使用率:约
84% -> 73%
8.7 输出示例与关键字
$ docker info --format '{{.DockerRootDir}}'
/data2/docker
$ du -sh /var/lib/docker /data2/docker
4.0K /var/lib/docker
9.4G /data2/docker
$ df -h / /data2
/dev/mapper/openeuler-root 63G 43G 17G 73% /
/dev/sdb1 196G 32G 155G 17% /data2
-
DockerRootDir:Docker 实际数据根目录(镜像/层/容器写入)。 -
overlay2:Docker 默认存储驱动目录,清理旧目录前需先卸载残留挂载。 -
Device or resource busy:目录仍被挂载占用,需先umount再删除。
更多推荐

所有评论(0)