镜像仓库管理
- [1 阿里云镜像仓库的使用](#1 阿里云镜像仓库的使用)
-
- [1.1 创建命名空间](#1.1 创建命名空间)
- [1.2 推送镜像到阿里云镜像仓库](#1.2 推送镜像到阿里云镜像仓库)
- [1.3 同步 Docker Hub 中的镜像到阿里云](#1.3 同步 Docker Hub 中的镜像到阿里云)
-
- [(1)Pull -> Tag -> Push](#(1)Pull -> Tag -> Push)
- [(2)skopeo(推荐,registry 直传不落盘)](#(2)skopeo(推荐,registry 直传不落盘))
常见的镜像仓库
Harbor:https://goharbor.io/
阿里云:https://cr.console.aliyun.com/
Docker官方:https://hub.docker.com/
镜像仓库可以放在公有云(阿里云、Docker Hub)、私有仓库、
镜像可以先同步到阿里云、再同步到私有云
服务在哪个云上,就同步到哪里
1 阿里云镜像仓库的使用
进入阿里云的容器镜像服务,点击右上角的控制台:

点击左上角的三条横线,然后在"产品与服务"中选择"容器镜像服务":


1.1 创建命名空间
命名空间就相当于Docker Hub的仓库名,接下来创建命名空间。
点击创建个人版示例:

学习的话,使用个人版就行了


命名空间的名字,要唯一,也就是没有被别人使用过:

创建一个公开的,一个私有的,其中公开仓库存放我们从公开仓库中拉取的,私有仓库自己制作的:

上面开启了自动创建仓库,那么仓库名就是命名空间的名字。
1.2 推送镜像到阿里云镜像仓库
下面是本地的镜像:

假如我想把 redis:6.0.20 推到我自己的命名空间。
先找到镜像地址:

改地址和 tag:
bash
docker tag redis:6.0.20 crpi-hfmqoeaccnhb4dwm.cn-shenzhen.personal.cr.aliyuncs.com/jim2/redis:6.0.20

接着在网页端设置登录密码:

接着在终端登录:
bash
docker login --username=xxxxx crpi-hfmqoeaccnhb4dwm.cn-shenzhen.personal.cr.aliyuncs.com
# 如果没有写地址,则默认登录 Docker Hub
如果准备退出,则用下面的命令:
bash
docker logout crpi-hfmqoeaccnhb4dwm.cn-shenzhen.personal.cr.aliyuncs.com
接下来是推送镜像:
bash
docker push crpi-hfmqoeaccnhb4dwm.cn-shenzhen.personal.cr.aliyuncs.com/jim2/redis:6.0.20

出现上面界面,说明推送成功。最后的提示表明,推送 Docker 镜像时,期望推送多平台镜像,但实际只生成并推送了单平台镜像,即 linux/arm64 版本未构建成功,最终只推送了 linux/amd64。我的工作不涉及 arm64 架构,所以这个提示不用理它。
我们点击镜像仓库,可以看到镜像名就是这里的"镜像仓库":

点进去可以看到版本,如果我们有多个版本,会在这里显示:

点击"基本信息"能看到如何拉取镜像:

拉取公开命名空间中的镜像不需要登录,拉取私有命名空间才需要。
1.3 同步 Docker Hub 中的镜像到阿里云
(1)Pull -> Tag -> Push
可以像前面一样,使用三条命令,先拉,后改tag,最后推送:
bash
docker pull nginx:1.21
docker tag nginx:1.21 crpi-hfmqoeaccnhb4dwm.cn-shenzhen.personal.cr.aliyuncs.com/jim2/nginx:1.21
docker push crpi-hfmqoeaccnhb4dwm.cn-shenzhen.personal.cr.aliyuncs.com/jim2/nginx:1.21
也可以写一个 Dockerfile 文件,该文件只有一条指令:
bash
FROM docker.io/library/nginx:1.21
然后执行:
bash
docker buildx build --platform linux/amd64 \
--provenance=false --sbom=false \
-t crpi-hfmqoeaccnhb4dwm.cn-shenzhen.personal.cr.aliyuncs.com/jim2/nginx:1.21 \
--push -f ./Dockerfile .
这样命令会少一些。
推送结束后,本地和阿里云镜像仓库都会有:


(2)skopeo(推荐,registry 直传不落盘)
skopeo 是一个不依赖 Docker 守护进程的容器镜像搬运工具------它直接跟镜像仓库(registry)的 HTTP API 对话,可以在两个仓库之间复制镜像,而不需要先把镜像拉到本机。
下面是 doker 与 skopeo 的对比:

使用前先安装:
bash
# 安装
yum install -y skopeo # RHEL/CentOS
# apt-get install -y skopeo # Ubuntu,注意版本要 ≥1.9 才支持 --multi-arch
配置镜像站::
bash
mkdir -p /etc/containers/registries.conf.d
cat > /etc/containers/registries.conf.d/001-docker-mirror.conf <<'EOF'
unqualified-search-registries = ["docker.io"]
[[registry]]
prefix = "docker.io"
location = "docker.io"
# 按响应速度自行增删,失败会自动 fallback 到下一个
[[registry.mirror]]
location = "docker.m.daocloud.io"
[[registry.mirror]]
location = "docker.xuanyuan.me"
[[registry.mirror]]
location = "docker.1ms.run"
EOF
接下来就是登录并同步:
bash
# 登录目标端(如果前面已经使用 docker login 登录,这一步可以省略)
skopeo login crpi-hfmqoeaccnhb4dwm.cn-shenzhen.personal.cr.aliyuncs.com \
--username=你的阿里云账号 --password=访问凭证密码
# 同步
skopeo copy --multi-arch=all \
docker://docker.io/library/nginx:1.22 \
docker://crpi-hfmqoeaccnhb4dwm.cn-shenzhen.personal.cr.aliyuncs.com/jim2/nginx:1.22
可以在镜像版本中看到我们刚刚推送的 1.22 版:

并且本地没有:

上面只是同步一个镜像,如果是一组镜像,那么可以批量同步。
在当前目录下新建一个名为 sync.yaml 的文件,内容如下:
bash
# sync.yaml
docker.io:
images:
library/nginx: ["1.21", "1.25", "latest"]
library/redis: ["7-alpine"]
然后执行:
bash
skopeo sync --src yaml --dest docker --multi-arch=all --scoped sync.yaml \
crpi-hfmqoeaccnhb4dwm.cn-shenzhen.personal.cr.aliyuncs.com/jim2