当前位置: 首页 > article >正文

我的docker随笔38:用 registry 搭建私有仓库

本文涉及一种在服务器部使用 registry 署私有镜像仓库的方法。经验证,可达到预期目标,并能应用在实际工作中。

一、引言

由于测试服务器无法使用外部网络,而又需要容器化部署应用程序。经考虑,使用 registry 搭建 docker 镜像仓库服务。当然,能提供类似的软件很多,功能也比较强大,但时间紧任务重,使用最简单的方式即可。

二、技术小结

  • 拉取 registry 镜像。
  • 运行 registry 容器,注意挂载目录。
  • 编辑daemon.json文件,添加仓库地址。

三、实践

3.1 下载、运行

拉取registry镜像:

docker pull registry:2

注:

实际操作中,因为服务器无法连接外部网络,因为是先在虚拟机下载好镜像,再通过docker save导出镜像,再用scp上传到服务器,再用docker load导入到服务器,完成“下载”动作。

新建工程目录,用于存储配置文件及数据文件。

新建config.yml配置文件:

version: 0.1
log:fields:service: registry
storage:delete:enabled: truecache:blobdescriptor: inmemoryfilesystem:rootdirectory: /var/lib/registry
http:addr: :5000headers:X-Content-Type-Options: [nosniff]
health:storagedriver:enabled: trueinterval: 10sthreshold: 3

注:上述config.yml文件实际是笔者启动容器后,直接取 /etc/docker/registry/config.yml 文件内容的,因为要加配置,所以单独拿出挂载。

上述文件加了删除使能配置。

docker-compose.yaml配置文件:

version: '2'services:ttregistry:image: registry:2container_name: ttregistryrestart: alwaysvolumes:- ./registry_data:/var/lib/registry- ./config.yml:/etc/docker/registry/config.yml environment:- TZ=Asia/Shanghaiports:- "5000:5000"networks:- registry-netnetworks:registry-net:driver: bridge

启动:

docker-compose up -d

3.2 配置仓库地址

因为本文registry没有配置https模式,而docker命令默认是该模式,因此需要设置非安全仓库地址。在daemon.json 中添加,示例:

$ cat /etc/docker/daemon.json 
{"registry-mirrors": ["https://a8qh6yqv.mirror.aliyuncs.com","http://hub-mirror.c.163.com"],"insecure-registries": ["http://172.18.18.168:5000"]
}

不管推送镜像还是拉取镜像,都可能遇到此问题。因此,都要在相应的机器上进行设置。

设置好后,需要重启docker服务:

sudo systemctl restart docker

如不配置,则在推送或拉取镜像出错,示例:

Using default tag: latest
Error response from daemon: Get https://172.18.18.168:5000/v2/: http: server gave HTTP response to HTTPS client

3.3 测试

拉取官方镜像

docker pull busybox

需要将镜像打上标签,否则默认上传到 docker 官方仓库。

#标记镜像
$ docker tag busybox 172.18.18.168:5000/busybox

推送镜像到私有仓库

$ docker push 172.18.18.168:5000/busybox
Using default tag: latest
The push refers to repository [172.18.18.168:5000/busybox]
01fd6df81c8e: Pushed 
latest: digest: sha256:62ffc2ed7554e4c6d360bce40bbcf196573dd27c4ce080641a2c59867e732dee size: 527

在另一机器上尝试拉取:

docker pull 172.18.18.168:5000/busybox

四、操作

4.1 接口

访问:http://172.18.18.168:5000/v2/,显示{},说明服务运行正常。

查询有哪些镜像:http://172.18.18.168:5000/v2/_catalog

查询某个镜像的版本:http://172.18.18.168:5000/v2/busybox/tags/list

4.2 命令

4.2.1 获取镜像信息
curl -H "Accept:application/vnd.docker.distribution.manifest.v2+json" http://172.18.18.168:5000/v2/<镜像名称>/manifests/<镜像版本>

示例:

$curl  -H "Accept:application/vnd.docker.distribution.manifest.v2+json" http://172.18.18.168:5000/v2/busybox/manifests/latest{"schemaVersion": 2,"mediaType": "application/vnd.docker.distribution.manifest.v2+json","config": {"mediaType": "application/vnd.docker.container.image.v1+json","size": 1456,"digest": "sha256:beae173ccac6ad749f76713cf4440fe3d21d1043fe616dfbe30775815d1d0f6a"},"layers": [{"mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip","size": 772788,"digest": "sha256:5cc84ad355aaa64f46ea9c7bbcc319a9d808ab15088a27209c9e70ef86e5a2aa"}]
}

注:

如果curl没有加-H字段,得到的结果较乱,不太方便分析,因此加上。

在浏览器直接访问亦可,但笔者测试发现,要下载文件再分析,故不采用。

4.2.2 删除镜像(测试不成功)

删除镜像需指定digest值,从获取镜像信息的config字段中找到即可。命令:

curl -X DELETE http://172.18.18.168:5000/v2/<镜像>/manifests/sha256:<config字段的digest值>

示例:

curl -X DELETE http://172.18.18.168:5000/v2/busybox/manifests/sha256:beae173ccac6ad749f76713cf4440fe3d21d1043fe616dfbe30775815d1d0f6a

垃圾回收:

docker exec -it ttregistry bin/registry garbage-collect /etc/docker/registry/config.yml
4.2.3 删除镜像另一法(有效)

些法是直接在物理层面删除,通过重启服务方式彻底删除。可不用上面配置delete功能。

删除存储卷上的镜像:

rm -rf registry_data/docker/registry/v2/repositories/busybox/

执行垃圾回收。

重启registry容器。

五、小结

本着适目的(其实是时间不足),本文仅使用 registry 即能达到目标,因此不再继续研究 Harbor 等高端的服务,日后如有必要,再进行亦未晚。实际上,笔者对 Harbor 也有接触,那时有雄心有干劲(挣钱),但那是很多年前的事了。

李迟 2022.10.20 周四 夜

http://www.lryc.cn/news/2417760.html

相关文章:

  • 常用概率分布的矩母函数、特征函数以及期望、方差的推导
  • ActiveMQ:消息的优先级与抢占机制
  • Tomcat下载及配置(IDEA)
  • Linux服务器JDK安装环境变量配置详细步骤
  • 【Java技术专题】「Guava技术系列」Guava-Collections实战使用相关Guava不一般的集合框架
  • CountDownLatch 和 CyclicBarrier 使用场景详解
  • 2024年安卓最全理解Android虚拟机体系结构,2024年最新Android高级工程师进阶学习
  • U盘启动盘怎么制作?
  • Regression算法之通俗讲解
  • UTF-8基础
  • 算法刷题笔记——动态规划篇
  • 损失函数MSE和MAE的区别以及如何选择
  • c语言md5函数头文件,【C】md5函数实现代码
  • 【Java】lambda表达式的3种写法
  • MyCat 管理及监控
  • 高级 Perl:文件处理与模块使用
  • 一文彻底了解ES6中的var、let、const基本用法以及暂时性死区和变量提升的区别
  • 深入浅出单例模式(全网最详细且通俗易懂讲解)
  • GPIO是啥
  • 都这麽大了还不快了解IDS?
  • HashMap笔记(自用+更新中)
  • String.format()的使用
  • 蓝牙beacon 功能简介
  • Kylin的介绍、使用和原理架构(Kylin3.0和Kylin4.0,Cube,去重原理,性能优化,MDX For Kylin,BI工具集成)
  • C++ MFC程序框架结构解析(详细)
  • vue系列 —— vue-route详细使用方法
  • Sqlmap常用命令总结
  • sudo权限管理
  • 是不是都把SELinux给忘了?
  • git命令归纳整理及如何使用