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

Posted 李迟

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我的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: true
  cache:
    blobdescriptor: inmemory
  filesystem:
    rootdirectory: /var/lib/registry
http:
  addr: :5000
  headers:
    X-Content-Type-Options: [nosniff]
health:
  storagedriver:
    enabled: true
    interval: 10s
    threshold: 3

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

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

docker-compose.yaml配置文件:

version: '2'

services:
  ttregistry:
    image: registry:2
    container_name: ttregistry
    restart: always
    volumes:
        - ./registry_data:/var/lib/registry
        - ./config.yml:/etc/docker/registry/config.yml 
    environment:
        - TZ=Asia/Shanghai
    ports:
        - "5000:5000"
    networks:
      - registry-net

networks:
  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 周四 夜

以上是关于我的docker随笔38:用 registry 搭建私有仓库的主要内容,如果未能解决你的问题,请参考以下文章

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

Docker registry垃圾回收

docker使用docker使用随笔

docker 搭建本地私有仓库

Docker基础-搭建本地私有仓库

DOCKER 08:搭建本地镜像仓库 Harbor