应该可以拥有一个临时的注册表容器(及其 docker 卷),从而允许 不多次下载镜像,即使在注册表(或整个 Docker 虚拟机)被丢弃并重新创建之后也是如此。
这只允许拉取一次图像,在互联网连接不好(或根本不可用)时可以使用它们;还允许安装带有预先下载的图像的docker volume
。这比手动
docker push
/
docker pull
到本地注册表或
docker save
/
docker load
需要在那里可用的每个图像更方便。
备注:
/var/lib/registry/docker/registry
。
docker
在macOS
上运行
minikube
;但答案不必特定于此。
配置
PROXIED_REGISTRY
、
REGISTRY_USERNAME
、
REGISTRY_PASSWORD
、
PATH_WHERE_TO_PERSIST_IMAGES
等)在主机上
如果使用 minikube,首先绑定到其虚拟机上的 docker
eval $(minikube docker-env)
或通过 minikube ssh
直接从虚拟机内部运行命令。创建本地注册表
-v
选项将您想要保存注册表数据的路径(存储库文件夹和图像层)安装到本地注册表上。当您使用
/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 非常有用)
它还可以将这些图像
move或push到辅助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