一、概述
本文将详细介绍如何在本地搭建一个 Docker 私有 Registry 仓库,并实现镜像的上传和管理。通过私有仓库,可以方便地在本地网络中存储和分发 Docker 镜像,提高开发和部署效率。
二、搭建步骤
(一)下载Docker Registry镜像
1. 命令:
1 2 3 |
# 此部分功能可以使用 Podman 替代 $ docker pull registry |
2. 解析:
- docker pull 是 Docker 的命令,用于从 Docker Hub 下载指定的镜像。
- registry 是 Docker 官方提供的 Registry 镜像,用于搭建私有仓库。
- 默认情况下,docker pull 会下载最新版本的镜像(latest 标签)。
(二)启动Docker Registry容器
1. 命令:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
# 此部分功能可以使用 Podman 替代 # Windows 系统 # docker machine ssh # 创建映射目录 $ mkdir .docker.registry $ docker run -d -p 5000:5000 --restart=always -v `pwd`/.docker.registry:/var/lib/registry --name registry registry # Windows 系统 # exit # 如果是 Windows 下的 Podman 则需要设置转发规则与防火墙 # 端口转发 # 参数说明 # v4tov4 : IPV4协议转发到IPV4协议 # listenport : 对外暴露的端口,其他设备访问本机的端口 # listenaddress : 监听地址,一般都是设置成 0.0.0.0 允许任何服务器访问服务 # connectport : podman提供的Docker容器的对外暴露端口 # connectaddress : podman提供的Docker容器的IP地址,由于podman每次重启都可能改变容器IP,但是本机都可以通过 127.0.0.1(localhost) 访问,所以干脆直接写成 127.0.0.1 # 特别注意的是,两个端口号不要写成一样的,否则会进入转发死循环 # netsh interface portproxy add v4tov4 listenport=6000 listenaddress=0.0.0.0 connectport=5000 connectaddress=127.0.0.1 # 防火墙放行端口,只需要允许外部访问进入即可 # netsh advfirewall firewall add rule name="Docker Registry Port 6000" dir=in action=allow protocol=TCP localport=6000 |
2. 解析:
- -d:表示以守护进程模式运行容器(后台运行)。
- -p 5000:6000:将容器的 5000 端口映射到宿主机的 6000 端口,用于访问私有仓库。
- --restart=always:设置容器在退出后自动重启,确保仓库服务始终可用。
- --name registry:为容器指定名称 registry,便于后续管理。
- registry:指定使用的镜像名称(即之前下载的 registry 镜像)。
3. 验证容器是否启动成功:
1 2 3 |
# 此部分功能可以使用 Podman 替代 $ docker ps |
如果看到名为 registry 的容器正在运行,并且端口映射正确,说明启动成功。
(三)配置Docker客户端以信任私有仓库
由于私有仓库默认使用 HTTPS 协议,Docker 客户端需要配置为信任该仓库。
编辑 /etc/docker/daemon.json 文件:
1 |
$ vim /etc/docker/daemon.json |
添加以下内容:
1 2 3 |
{ "insecure-registries": ["10.10.10.189:6000"] } |
insecure-registries:指定不安全的仓库地址,允许 Docker 客户端通过 HTTP 协议访问该地址。
重启 Docker 服务:
1 |
$ systemctl restart docker |
重启 Docker 服务后,配置生效。
如果使用的是 Docker Desktop 则参考下图修改:
(四)上传镜像到私有仓库
此部分功能暂时不能使用 Podman 替代
1. 标记镜像:
1 2 3 4 5 6 |
# docker pull nginx # docker image list # REPOSITORY TAG IMAGE ID CREATED SIZE # docker.io/library/nginx latest 4e1b6bae1e48 3 days ago 197 MB $ docker image tag nginx:latest 10.10.10.189:6000/docker.io/library/nginx:latest |
- docker image tag:用于为镜像重新标记一个新的名称和标签。
- nginx:latest:本地已有的镜像名称和标签。
- 10.10.10.189:6000/docker.io/library/nginx:latest:目标仓库地址和镜像名称。
2. 推送镜像到私有仓库:
1 |
$ docker push 10.10.10.189:6000/docker.io/library/nginx:latest |
- docker push:将标记后的镜像推送到指定的仓库地址。
- 如果推送成功,会显示镜像层的上传进度和最终的摘要信息。
(五)验证镜像是否上传成功
通过 API 查看仓库中的镜像:
1 |
$ curl 10.10.10.189:6000/v2/_catalog |
三、skopeo 简化多架构同步
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# macOS 15.4.2 skio 1.18.0 # brew install skopeo # sync 同步 # --all 参数指定多架构 x86/arm/mips等 # --dest-tls-verify=false 目标地址使用 http 协议而不是 https 协议 $ skopeo sync --all --dest-tls-verify=false --src docker --dest docker docker.io/library/nginx:latest 10.10.10.189:6000/docker.io/library # 删除镜像 # skopeo delete --tls-verify=false docker://10.10.10.189:6000/docker.io/nginx:latest # 查看同步后的镜像信息 # skopeo inspect --tls-verify=false docker://10.10.10.189:6000/docker.io/nginx:latest # no image found in image index for architecture "arm64", variant "v8", OS "linux" # skopeo inspect --tls-verify=false --raw docker://10.10.10.189:6000/docker.io/nginx:latest | jq |
四、常见问题及解决方法
(一)无法连接到私有仓库
1. 问题描述:
1 |
Get "https://10.10.10.189:6000/v2/": dial tcp 10.10.10.189:6000: connect: connection refused |
2. 解决方法:
- 确保 /etc/docker/daemon.json 文件中正确配置了 insecure-registries。
- 确保 Docker 服务已重启。
- 确保仓库地址正确,且防火墙允许访问 6000 端口。
(二)网络问题导致无法解析地址
1. 问题描述: 如果尝试访问 http://10.10.10.189:6000 或 https://10.10.10.189:6000/v2/ 时,可能会遇到解析失败的问题。
2. 解决方法:
- 检查仓库地址是否正确,确保 IP 地址和端口无误。
- 确保网络连接正常,可以尝试 ping 或 curl 测试连通性。
- 如果问题仍然存在,可能是网络配置或防火墙限制,建议检查网络设置或联系网络管理员。
(三)是否可以使用 Podman 替代
目前测试 push 镜像功能是有问题的,在推送的时候会报错,其他功能都是正常的。
如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
$ podman push 10.10.10.189:6000/docker.io/library/nginx:latest --tls-verify false Getting image source signatures Copying blob sha256:ccc5aac17fc4db15cf1c4562216e158143fc4540bf88a116b3862c5c205a2bbd Copying blob sha256:9aad78ecf38071e3f8840ed045b8942764c9422f57a93f7ce3ef454cefea1493 Copying blob sha256:bd903131a05ed20c1ad9a8d5bb5b59cd0afa1b5b48683678cf71305863b74433 Copying blob sha256:9e3c6e8c1e2584acc82890d31d41f8728460629ea3933e584815122eaa954984 Copying blob sha256:8d83f6b791435d460ba4e233e9be563a2308d7712fc15239836ea01365f8c008 Copying blob sha256:ea680fbff095473bb8a6c867938d6d851e11ef0c177fce983ccc83440172bd72 Copying blob sha256:d1e3e4dd1aaaad7a94f9d28564746092e7da13a34ee69a8c23d5ae34eabdc480 Getting image source signatures Copying blob sha256:ccc5aac17fc4db15cf1c4562216e158143fc4540bf88a116b3862c5c205a2bbd Copying blob sha256:bd903131a05ed20c1ad9a8d5bb5b59cd0afa1b5b48683678cf71305863b74433 Copying blob sha256:ea680fbff095473bb8a6c867938d6d851e11ef0c177fce983ccc83440172bd72 Copying blob sha256:9e3c6e8c1e2584acc82890d31d41f8728460629ea3933e584815122eaa954984 Copying blob sha256:9aad78ecf38071e3f8840ed045b8942764c9422f57a93f7ce3ef454cefea1493 Copying blob sha256:8d83f6b791435d460ba4e233e9be563a2308d7712fc15239836ea01365f8c008 Copying blob sha256:d1e3e4dd1aaaad7a94f9d28564746092e7da13a34ee69a8c23d5ae34eabdc480 Getting image source signatures Copying blob sha256:ccc5aac17fc4db15cf1c4562216e158143fc4540bf88a116b3862c5c205a2bbd Copying blob sha256:bd903131a05ed20c1ad9a8d5bb5b59cd0afa1b5b48683678cf71305863b74433 Copying blob sha256:ea680fbff095473bb8a6c867938d6d851e11ef0c177fce983ccc83440172bd72 Copying blob sha256:8d83f6b791435d460ba4e233e9be563a2308d7712fc15239836ea01365f8c008 Copying blob sha256:9aad78ecf38071e3f8840ed045b8942764c9422f57a93f7ce3ef454cefea1493 Copying blob sha256:9e3c6e8c1e2584acc82890d31d41f8728460629ea3933e584815122eaa954984 Copying blob sha256:d1e3e4dd1aaaad7a94f9d28564746092e7da13a34ee69a8c23d5ae34eabdc480 Getting image source signatures Copying blob sha256:ccc5aac17fc4db15cf1c4562216e158143fc4540bf88a116b3862c5c205a2bbd Copying blob sha256:bd903131a05ed20c1ad9a8d5bb5b59cd0afa1b5b48683678cf71305863b74433 Copying blob sha256:ea680fbff095473bb8a6c867938d6d851e11ef0c177fce983ccc83440172bd72 Copying blob sha256:9e3c6e8c1e2584acc82890d31d41f8728460629ea3933e584815122eaa954984 Copying blob sha256:9aad78ecf38071e3f8840ed045b8942764c9422f57a93f7ce3ef454cefea1493 Copying blob sha256:8d83f6b791435d460ba4e233e9be563a2308d7712fc15239836ea01365f8c008 Copying blob sha256:d1e3e4dd1aaaad7a94f9d28564746092e7da13a34ee69a8c23d5ae34eabdc480 Error: trying to reuse blob sha256:ea680fbff095473bb8a6c867938d6d851e11ef0c177fce983ccc83440172bd72 at destination: pinging container registry registry-1.docker.io: Get "https://registry-1.docker.io/v2/": dial tcp 108.160.169.178:443: i/o timeout |
使用 docker 执行上述命令不会报错。
参考链接
- Docker Registry 私有仓库简单搭建
- Docker/DockerHub 国内镜像源/加速列表(4月18日更新-长期维护)
- 南京大学开源镜像
- docker registry 指定目录
- 快速搭建并迁移离线docker registry镜像仓库
- 解决docker:denied: requested access to the resource is denied
- 使用 podman 推送数据到私有仓库的 3 个问题记录
- 【K8S】docker打过tag标签后向镜像仓库推送镜像(push)
- Docker部署私有仓库(registry&Harbor)
- OCI Distribution Specification.
- Distribution Registry
- Docker:使用x86平台Docker 拉取 arm版镜像
- 13.Manifest实现多CPU架构Docker镜像(Docker 镜像跨平台使用)
- 如何保存/同步多架构容器 Docker 镜像
- skopeo导入导出多架构镜像
- 最佳镜像搬运工 Skopeo 指南(2)
- 一文带你上手镜像搬运工具 Skopeo
- skopeo-sync - Synchronize images between container registries and local directories.
- skopeo-sync - Synchronize images between registry repositories and local directories.
- no image found in manifest list for architecture amd64, variant "", OS darwin FAIL