镜像仓库迁移需按目标分类操作:一是本地存储路径迁移,推荐修改daemon.json的data-root;二是托管平台迁移,需批量替换镜像地址并重新构建推送;三是跨服务器离线迁移,依赖docker save/load加文件传输。
镜像仓库迁移不是简单换地址,得看你是想换存储位置、换托管平台,还是换仓库类型(比如从 Docker Hub 切到私有 Harbor)。不同目标对应不同操作逻辑,下面分三类说清楚。
当磁盘空间告急或想用高性能 SSD 存镜像时,需要迁移 Docker 的根目录。推荐用 daemon.json 配置法,稳定且最新支持。
sudo systemctl stop docker
sudo mkdir -p /data/docker && sudo rsync -aqxp /var/lib/docker/ /data/docker/
/etc/docker/daemon.json,加入:{"data-root": "/data/docker"}
sudo systemctl start docker && docker info | grep "docker root dir"
sudo rm -rf /var/lib/docker
注意权限和 SELinux:目标目录需 chown root:root、chmod 700;CentOS/RHEL 上可能要执行 sudo setsebool -P container_manage_cgroup on 或调整策略。
这类迁移重点是批量更新镜像引用地址,并重新构建推送,避免手动改几百个 Dockerfile。
FROM 行中的 registry 地址,例如把 r.j3ss.co/nginx 替成 gitcode.com/gh_mirrors/do/dockerfiles/nginx
make image 自动带上新 registry 前缀docker build -t new-registry/app:v1 . && docker push new-registry/app:v1
echo "$PASSWORD" | docker login --username "$USER" --password-stdin new-registry
若涉及私有仓库,还需在 /etc/docker/daemon.json 中配置 insecure-registries(仅限测试环境)或部署 TLS 证书。
适合生产环境隔离、内网部署或带宽受限场景,核心是导出 + 传输 + 导入。
docker save -o app.tar app:v2.1(可加 | gzip 压缩)docker load -i app.tar
docker images | grep app
注意点:源和目标的 Docker 版本尽量一致(尤其低于 v20.10 时兼容性更敏感);如果镜像有多个 tag,建议导出时明确指定完整标签,避免加载后 tag 缺失;若含构建阶段多层镜像,save/load 能完整保留所有 layer 和历史信息。