前言
平常要用什麼 Image,就是直接從 Docker Hub 拉下來就好了。但如果公司的環境不能連外呢?那就得自己架個 Registry,把要用的 Images 搬進去。
如果每次都先 pull、改 tag、再 push,也是有點麻煩。用 Skopeo 就可以省掉這些步驟,直接在 Registry 之間複製 Images。
簡介 Skopeo
Skopeo 是操作 Container Images 與 Registry 的開源工具,可以直接複製或查詢遠端 Images,不必先 docker pull,也不需要 Docker daemon。
常用功能有三個:
- Copy:把 Images 從一個 Registry 搬到另一個,例如 Quay。
- Inspect:不下載整個 Image,就能查看 Metadata。
- Delete:刪除遠端 Image。
delete 要小心:即使指定 tag,目前也會依 digest 刪除 manifest,可能影響共用該 manifest 的其他 tags。Registry 必須允許刪除,空間回收則由 Garbage Collection 處理。
Day 2 Operation 探討
1. 如何從 Docker Hub 複製 Images 到自家的倉庫去?
先登入自己的 Registry,再複製 Images:
1
2
3
4
5
| skopeo login --username divazone quay.divazone.local
skopeo copy --all \
docker://docker.io/library/nginx:latest \
docker://quay.divazone.local/divazone/nginx:latest
|
1
2
3
4
5
6
7
8
9
10
11
| Copying blob sha256:802b00ed6f79f48e6a5f44ecbcaf43563d6077aaecb565eee1dfc615c0b18c00
21.44 MB / 21.44 MB [=====================================================] 20s
Copying blob sha256:e9d0e0ea682bf3ccff3215d4fd1f577403b7d6ca05a9ea34a85fde6eda92e7b6
21.16 MB / 21.16 MB [=====================================================] 14s
Copying blob sha256:d8b7092b92215f6d5ed0a1c78928bb0b8e651948b15b30b71983bfb267725c72
204 B / 204 B [============================================================] 5s
Copying config sha256:06144b2878448774e55577ae7d66b5f43a87c2e44322b3884e4e6c70d070b262
5.88 KB / 5.88 KB [========================================================] 5s
Writing manifest to image destination
Writing manifest to image destination
Storing signatures
|
--all 會連同 manifest list / OCI index 複製該 tag 的所有平台映像;不加就只複製符合本機平台的版本。它不會複製所有 tags,要批次同步可用 skopeo sync。
這裡用 latest 示範,正式使用可改成指定版本或 digest。
執行指令的主機要能連到兩邊的 Registry。完全隔離時,先用 oci: 或 oci-archive: 匯出,再搬進內網匯入。
2. 如何從 Docker Hub 複製 Private Images 到自家的倉庫去?
加個 --src-creds 'divazone:PASSWORD_OR_TOKEN' 就好。也可以像下面這樣先登入 Docker Hub:
1
2
3
4
5
| skopeo login --username divazone docker.io
skopeo copy --all \
docker://docker.io/divazone/secret:latest \
docker://quay.divazone.local/divazone/secret:latest
|
3. 如何從本機 Docker 複製到某個 Repos 去?
本機已經有 nginx:latest 的話,可以直接從 Docker 搬出去:
1
2
3
| skopeo copy \
docker-daemon:nginx:latest \
docker://quay.divazone.local/divazone/nginx:latest
|
docker-daemon: 需要 Docker daemon 正在執行,而且使用者有存取權限。它只複製本機已有的映像,不會補齊其他平台。Podman / Buildah / CRI-O 的本機儲存則使用 containers-storage:。
1
| skopeo inspect docker://docker.io/library/nginx:latest
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| {
"Name": "docker.io/library/nginx",
"Digest": "sha256:24a0c4b4a4c0eb97a1aabb8e29f18e917d05abfe1b7a7c07857230879ce7d3d3",
"RepoTags": [
"1-alpine-perl",
"1-alpine",
"1-perl",
"1.10-alpine",
"1.10.0-alpine",
"1.10.0",
...
],
...
}
|
輸出的架構資訊對應本機平台。要看原始 manifest,或多架構映像的 manifest list / OCI index,加上 --raw:
1
| skopeo inspect --raw docker://docker.io/library/nginx:latest
|
5. 複製這件事沒有 Skopeo 之前是怎麼做的?
先 pull 到本機,重新 tag,再 push:
1
2
3
4
| docker login --username divazone quay.divazone.local
docker pull docker.io/library/nginx:latest
docker tag docker.io/library/nginx:latest quay.divazone.local/divazone/nginx:latest
docker push quay.divazone.local/divazone/nginx:latest
|
這個流程預設只搬本機平台,不等同於 skopeo copy --all。Docker CLI 也需要另外登入。
References