• Ubuntu 搭建docker registry 私有仓库


    一、为什么要搭建 docker 私有仓库

    原因有几个:

    1. 项目需要,不希望将项目放到 docker hub 上。
    2. 环境需求,考虑网络、效率的问题,希望在私有服务器上建立自用的仓库,提高便利性和访问速度。
    3. 可以做更多的个性化配置。

    二、用什么搭建 docker 私有仓库

    docker 官方提供了 registry 的镜像,可以使用它来建私有仓库。

    三、搭建过程

    环境介绍

    系统 IP 角色
    ubuntu-16.04.5-server-amd64 192.168.91.129 docker 客户端服务器
    ubuntu-16.04.5-server-amd64 192.168.91.131 docker 仓库服务器

    安装docker

    2台服务器,都安装docker

    apt-get install -y docker.io



    配置阿里云docker加速器

    2台服务器都 编辑配置文件

    vim /etc/docker/daemon.json 

    内容如下:

    {
       "registry-mirrors": [
          "https://kv3qfp85.mirror.aliyuncs.com"
        ]
    }

    2台服务器都 重启docker服务

    systemctl restart docker

    拉取registry仓库docker镜像

    在131服务器 拉取镜像

    docker pull registry

    默认会拉取最新版本,访问以下链接:

    https://hub.docker.com/_/registry/

    版本应该是2.6.2

    创建registry docker进程

    docker run -d --name docker-registry --restart=always -p 5000:5000 registry

    参加解释:

    -d 后台运行

    --name 镜像名称起别名

    --restart=always 在容器退出时总是重启容器,注意:在生产环境中,要启用这个参数

    -p 映射端口,规则是, 真实机端口:容器端口

    四、测试上传镜像

    下载测试镜像

    登录到129服务器,下载一个镜像,比如alpine

    docker pull alpine

    将alpine镜像重命名为本地镜像格式与本地registry相匹配。

    镜像名称由registry和tag两部分组成,registry完整格式:[registry_ip]:[registry:port]/[user]/[image_name:version]

    docker tag alpine 192.168.91.131:5000/alpine

    上传测试镜像

    docker push 192.168.91.131:5000/alpine

    输出:

    The push refers to a repository [192.168.91.131:5000/alpine]
    Get https://192.168.91.131:5000/v1/_ping: http: server gave HTTP response to HTTPS client

    因为Docker从1.3.X之后,与docker registry交互默认使用的是https,然而此处搭建的私有仓库只提供http服务,所以当与私有仓库交互时就会报上面的错误。

    解决https错误

    关于解决https错误,众说纷纭。什么修改/etc/default/docker,修改/etc/init/docker.conf,修改/lib/systemd/system/docker.service...

    我测试了一下,貌似没有成功!

    下面说能成功的方法。

    修改daemon.json

    注意:2台服务器都需要修改!

    vim /etc/docker/daemon.json 

    增加 insecure-registries,完整内容如下:

    {
       "registry-mirrors": [
          "https://kv3qfp85.mirror.aliyuncs.com"
       ],
       "insecure-registries": [
          "192.168.91.131:5000"
        ]
    }

    insecure-registries 是一个列表,你可以增加多个。

    重启docker服务

    systemctl restart docker

    再次执行

    root@jqb-node129:~# docker push 192.168.91.131:5000/alpine
    The push refers to a repository [192.168.91.131:5000/alpine]
    df64d3292fd6: Pushed 
    latest: digest: sha256:b6459ba7992adb5d76a7962e84909e1b3aaf029fbd8cb94131e8cbe464b6cd04 size: 528

    登录到131服务器,查看镜像

    注意:私有仓库中的镜像不是直接docker images查看的,而是访问url

    比如:

    curl -XGET http://registry地址:5000/v2/_catalog
    curl -XGET http://registry地址:5000/v2/镜像名/tags/list

    先执行第一个,查看现有的镜像

    root@jqb-node129:~# curl -XGET http://192.168.91.131:5000/v2/_catalog
    {"repositories":["alpine"]}

    查看alpine镜像的信息

    root@jqb-node129:~# curl -XGET http://192.168.91.131:5000/v2/alpine/tags/list
    {"name":"alpine","tags":["latest"]}

    docker 官方的 registry 仓库,默认是不支持从其他客户端拉取服务器仓库的镜像文件的,不过简单的办法,就是设置insecure-registry 参数。

    五、镜像删除

    官方提供了删除镜像的API

    DELETE /v2/<name>/manifests/<reference>

    name:镜像名称

    reference: 镜像对应sha256值

    重点是:镜像对应sha256值,计算非常麻烦。

    所以这里使用第三方插件来删除

    第三方插件删除

    插件github上的位置:

    https://github.com/burnettk/delete-docker-registry-image

    下载资源

    curl https://raw.githubusercontent.com/burnettk/delete-docker-registry-image/master/delete_docker_registry_image.py | sudo tee /usr/local/bin/delete_docker_registry_image >/dev/null

    设置权限

    chmod a+x /usr/local/bin/delete_docker_registry_image 

    设置相关环境变量

    先来搜索registry

    root@jqb-node131:~# find / -name registry
    /usr/share/vim/registry
    /var/lib/docker/volumes/518c02aa36ce326f1dcc5cc397d21f621b28e690b864ca3d36e474a4d657ea13/_data/docker/registry
    /var/lib/docker/aufs/diff/d4f4fd0107a55fa3b608a4ff9b13a94b2246b0eb212714b8b61bf8e383a062e8/var/lib/registry
    /var/lib/docker/aufs/diff/bc0dbcfaf524ebed6a9957d3b7e81847f0f3eb3caee1936035f61bf734e82636/etc/docker/registry
    /var/lib/docker/aufs/diff/693c5a102cda676001a36d96b988a3967734123d788df90ffd5d90af43dfcff2/bin/registry
    /var/lib/docker/aufs/diff/d60ed6fa449324e4075ae7bbff41b31c36a80c4e5a5fa8fabbc4e07436ee8bf6/var/lib/registry
    /var/lib/docker/aufs/mnt/d60ed6fa449324e4075ae7bbff41b31c36a80c4e5a5fa8fabbc4e07436ee8bf6/var/lib/registry
    /var/lib/docker/aufs/mnt/d60ed6fa449324e4075ae7bbff41b31c36a80c4e5a5fa8fabbc4e07436ee8bf6/etc/docker/registry
    /var/lib/docker/aufs/mnt/d60ed6fa449324e4075ae7bbff41b31c36a80c4e5a5fa8fabbc4e07436ee8bf6/bin/registry
    /var/lib/ucf/registry

    从上面搜索结果中,有很多。这么多目录,那一个才是真正的呢?

    末尾带有_data/docker/registry才是真正的存储目录

    查看这个目录,进一步查看v2/repositories

    root@jqb-node131:~# ll /var/lib/docker/volumes/518c02aa36ce326f1dcc5cc397d21f621b28e690b864ca3d36e474a4d657ea13/_data/docker/registry/v2/repositories/
    total 12
    drwxr-xr-x 3 root root 4096 Nov 12 15:46 ./
    drwxr-xr-x 4 root root 4096 Nov 12 15:46 ../
    drwxr-xr-x 5 root root 4096 Nov 12 15:46 alpine/

    就可以发现 alpine了,就是客户端上传的镜像。

    设置环境变量注意:要去掉上面路径中末尾的repositories

    export REGISTRY_DATA_DIR=/var/lib/docker/volumes/518c02aa36ce326f1dcc5cc397d21f621b28e690b864ca3d36e474a4d657ea13/_data/docker/registry/v2/

    直接删除镜像

    先来查看一下镜像列表

    root@jqb-node131:~# curl http://192.168.91.131:5000/v2/_catalog
    {"repositories":["alpine"]}

    再查看alpine的tag

    root@jqb-node131:~# curl http://192.168.91.131:5000/v2/alpine/tags/list
    {"name":"alpine","tags":["latest"]}

    之后就可以直接删除:

    语法:

    delete_docker_registry_image --image 镜像名:版本

    例如:

    root@jqb-node131:~# delete_docker_registry_image --image alpine:latest

    输出如下:

    INFO     [2018-11-12 16:22:09,413]  Deleting /var/lib/docker/volumes/518c02aa36ce326f1dcc5cc397d21f621b28e690b864ca3d36e474a4d657ea13/_data/docker/registry/v2/blobs/sha256/b6/b6459ba7992adb5d76a7962e84909e1b3aaf029fbd8cb94131e8cbe464b6cd04
    INFO     [2018-11-12 16:22:09,418]  Deleting /var/lib/docker/volumes/518c02aa36ce326f1dcc5cc397d21f621b28e690b864ca3d36e474a4d657ea13/_data/docker/registry/v2/blobs/sha256/19/196d12cf6ab19273823e700516e98eb1910b03b17840f9d5509f03858484d321
    INFO     [2018-11-12 16:22:09,419]  Deleting /var/lib/docker/volumes/518c02aa36ce326f1dcc5cc397d21f621b28e690b864ca3d36e474a4d657ea13/_data/docker/registry/v2/blobs/sha256/2b/2bc1c5ee86055a39979b389170e9638262b2e11e1761403e5e0321101f96b427
    INFO     [2018-11-12 16:22:09,421]  Deleting /var/lib/docker/volumes/518c02aa36ce326f1dcc5cc397d21f621b28e690b864ca3d36e474a4d657ea13/_data/docker/registry/v2/repositories/alpine
    View Code

    再看一下本地仓库的镜像有几个

    root@jqb-node131:~# curl http://192.168.91.131:5000/v2/_catalog
    {"repositories":[]}

    发现已经为空了!

    本文参考链接:

    http://blog.51cto.com/wangpengtai/2093613

    https://blog.csdn.net/tototuzuoquan/article/details/82025954

  • 相关阅读:
    数据库设计步骤 java程序员
    (1) 语法结构 java程序员
    (3)JavaScript学习笔记 函数、对象、数组 java程序员
    JavaScript 学习计划 java程序员
    (5)JavaScript学习笔记 变量 java程序员
    (2) 数据类型、值 及 字符串 java程序员
    (4)JavaScript学习笔记 数据类型和值(续) java程序员
    J2EE、J2SE、J2ME是什么意思? java程序员
    80端口(该端口是Tomcat的监听端口)已经被其他程序占用 java程序员
    (17) string 和 stringbuilder java程序员
  • 原文地址:https://www.cnblogs.com/xiao987334176/p/9946915.html
Copyright © 2020-2023  润新知