如何本地备份本地 Docker 注册表的镜像?

问题描述 投票:0回答:2
  • 如何创建一个本地注册表容器,从主机挂载卷并在本地保留所有拉取的映像?

具有持久镜像的本地 Docker 注册表

应该可以拥有一个临时的注册表容器(及其 docker 卷),从而允许 不多次下载镜像,即使在注册表(或整个 Docker 虚拟机)被丢弃并重新创建之后也是如此。

只允许拉取一次图像,在互联网连接不好(或根本不可用)时可以使用它们;还允许安装带有预先下载的图像的docker volume

这比手动
docker push
/
docker pull
 到本地注册表或 
docker save
/
docker load
 需要在那里可用的每个图像更方便。

备注:

    坐骑的目的地可能应该是
  • /var/lib/registry/docker/registry
  • 可以将本地 Docker 注册表配置为
  • 拉通缓存
  • 我的具体设置通过
  • docker
    macOS
     上运行 
    minikube;但答案不必特定于此。
docker minikube docker-registry docker-volume
2个回答
0
投票
我成功了,这是分步说明。希望能让别人的生活更轻松!

配置

首先使用所需的值定义环境变量。请参阅下面代码中的环境变量(

PROXIED_REGISTRY

REGISTRY_USERNAME
REGISTRY_PASSWORD
PATH_WHERE_TO_PERSIST_IMAGES
等)

在主机上

Minikube

如果使用 minikube,首先绑定到其虚拟机上的 docker

eval $(minikube docker-env)
或通过 

minikube ssh

 直接从虚拟机内部运行命令。

创建本地注册表

(注意:某些环境可能是不必要的;检查 Docker 文档以了解您需要什么)

-v

选项将您想要保存注册表数据的路径(存储库文件夹和图像层)安装到本地注册表上。
当您使用
Minikube 时,后者 会自动将主文件夹从主机/Users/
,在 
macOS 上)安装到运行 Docker 的虚拟机上。

docker run -d -p 5000:5000 \ -e STANDALONE=false \ -e "REGISTRY_LOG_LEVEL=debug" \ -e "REGISTRY_REDIRECT_DISABLE=true" \ -e MIRROR_SOURCE="https://${PROXIED_REGISTRY}" \ -e REGISTRY_PROXY_REMOTEURL="https://${PROXIED_REGISTRY}" \ -e REGISTRY_PROXY_USERNAME="${REGISTRY_USER}" \ -e REGISTRY_PROXY_PASSWORD="${REGISTRY_PASSWORD}" \ -v /Users/${MACOS_USERNAME}/${PATH_WHERE_TO_PERSIST_IMAGES}/docker/registry:/var/lib/registry \ --restart=always \ --name local-registry \ registry:2
登录到您的本地注册表

echo -n "${REGISTRY_PASSWORD}" | docker login -u "${REGISTRY_USER}" --password-stdin "localhost:5000"
(可选)验证持久目录是否存在

docker exec registry ls -la /var/lib/registry/docker/registry ll /Users/${MACOS_USERNAME}/${PATH_WHERE_TO_PERSIST_IMAGES}/docker/registry/docker/registry
尝试从您的私人注册表中提取一张图像

(查看它通过存储库代理

localhost:5000

docker pull localhost:5000/${REPOSITORY}/${IMAGE}:${IMAGE_TAG}
(可选)根据需要验证图像数据已在本地主机上同步

docker exec registry ls -la /var/lib/registry/docker/registry ll /Users/${MACOS_USERNAME}/${PATH_WHERE_TO_PERSIST_IMAGES}/docker/registry/docker/registry
如果使用 Kubernetes 

将部署

spec

 容器 
image
 更改为:

localhost:5000/${REPOSITORY}/${IMAGE}:${IMAGE_TAG}

瞧! 您现在可以将从存储库下载的图像存储到您的主机上!
如果互联网可用,本地注册表将确保拥有您拉取的映像的最新版本,并向代理注册表(私有或 Docker 中心)请求它。

当您的互联网连接速度太慢而无法重新下载您需要的所有内容或完全不可用时,您将拥有运行容器的最后手段备份!

(当您需要销毁 docker 虚拟机时,
Minikube 非常有用)


参考资料:

  • https://docs.docker.com/registry/recipes/mirror/#run-a-registry-as-a-pull-through-cache
  • https://minikube.sigs.k8s.io/docs/handbook/mount/#driver-mounts

0
投票
以下代码非常适合备份本地注册表:2 个图像。

它还可以将这些图像
movepush到辅助docker注册表。

#!/usr/bin/env bash user=john pass=a1b2c3d4e5f6 origin=docker.host.io dest=docker.otherhost.io # Grab catalog repoList=$(curl -s -X GET -k "https://$user:$pass@$origin/v2/_catalog" | jq -r '.repositories[]') # Craft repo names for the last 3 tags for each repo # Remove `[0:3]` to backup all tags repoTagList=$(for r in $repoList; do curl -s -X GET -k "https://$user:$pass@$origin/v2/$r/tags/list" | jq -r '"'$r':"+ .tags[0:3][]' | sort; done) for repo in repoTagList; do echo "Backing up $repo"; docker pull $origin/$repo; # comment out these lines to avoid upload docker tag $origin/$repo $dest/$repo; docker push $dest/$repo; # comment out this line to keep images locally docker rmi $origin/$repo; done
    
© www.soinside.com 2019 - 2024. All rights reserved.