搭建docker私有仓库的方法

发布时间 - 2020-11-10 00:00:00    点击率:

1、背景介绍

在 Docker 中,当我们执行 docker pull xxx 命令的时候,可能会比较好奇,docker 会去哪儿查找并下载镜像呢?

相关推荐:docker教程

疑问回答:

它实际上是从 registry.hub.docker.com 这个地址去查找,这就是Docker公司为我们提供的公共仓库,上面的镜像,大家都可以到,也可以使用。所以,我们也可以带上仓库地址去拉取镜像,如:docker pull registry.hub.docker.com/library/alpine,不过要注意,这种方式下载的镜像的默认名称就会长一些。

如果要在公司中使用 Docker,我们基本不可能把商业项目上传到公共仓库中,那如果要多个机器共享,又能怎么办呢?

正因为这种需要,所以私有仓库也就有用武之地了。

所谓私有仓库,也就是在本地(局域网)搭建的一个类似公共仓库的东西,搭建好之后,我们可以将镜像提交到私有仓库中。这样我们既能使用 Docker 来运行我们的项目镜像,也避免了商业项目暴露出去的风险。

下面我们用官方提供的registry镜像来搭建私有镜像仓库,当然还有其它很多方法。

2、环境

准备两台安装好docker的服务器: 服务端机器 (主机名为registry):docker私有仓库服务器,运行registry容器; 测试端机器 (主机名为node):普通的docker服务器,在这台服务器上下载一个测试镜像nginx,然后上传到registry服务器进行测试;

3、部署(服务端操作)

  1. 下载镜像registry

    # docker pull registryUsing default tag: latest
    latest: Pulling from library/registry
    81033e7c1d6a: Pull complete 
    b235084c2315: Pull complete 
    c692f3a6894b: Pull complete 
    ba2177f3a70e: Pull complete 
    a8d793620947: Pull complete 
    Digest: sha256:672d519d7fd7bbc7a448d17956ebeefe225d5eb27509d8dc5ce67ecb4a0bce54
    Status: Downloaded newer image for registry:latest复制代码
  2. 查看镜像

    # docker imagesREPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    registry            latest              f32a97de94e1        3 months ago        25.8 MB复制代码
  3. 运行registry容器

    # docker run -itd -v /data/registry:/var/lib/registry -p 5000:5000 --restart=always --name registry registry:latest

    06a972de6218b1f1c3bf9b53eb9068dc66d147d14e18a89ab51db13e339d3dc9

    参数说明 -itd:在容器中打开一个伪终端进行交互操作,并在后台运行; -v:把宿主机的/data/registry目录绑定 到 容器/var/lib/registry目录(这个目录是registry容器中存放镜像文件的目录),来实现数据的持久化; -p:映射端口;访问宿主机的5000端口就访问到registry容器的服务了; --restart=always:这是重启的策略,假如这个容器异常退出会自动重启容器; --name registry:创建容器命名为registry,你可以随便命名; registry:latest:这个是刚才pull下来的镜像;

  4. 测试镜像仓库中所有的镜像

    # curl http://127.0.0.1:5000/v2/_catalog
    {"repositories":[]}
    现在是空的,因为才刚运行,里面没有任何镜像内容。

4、测试镜像仓库(测试端操作)

  1. 修改源和镜像仓库

    # vim /etc/docker/daemon.json{"registry-mirrors": [ "https://registry.docker-cn.com"]
    }# systemctl restart docker复制代码
  2. 下载nginx镜像

    # docker pull nginx# docker imagesREPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    nginx               latest              719cd2e3ed04        2 weeks ago         109MB复制代码
  3. 为镜像打标签

    # docker tag nginx:latest registry服务器:5000/nginx:kurisu复制代码

    格式说明:Usage: docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]

    nginx:lastest 这是源镜像,也是刚才pull下来的镜像文件;
    registry服务器:5000/nginx:kurisu 这是目标镜像,也是registry私有镜像服务器的IP地址和端口;

    查看效果

     # docker images
      
     REPOSITORY                 TAG                 IMAGE ID            CREATED             SIZE
     registry服务器:5000/nginx   kurisu              719cd2e3ed04        2 weeks ago         109MB
     nginx                      latest              719cd2e3ed04        2 weeks ago         109MB复制代码
  4. 上传到镜像服务器

    # docker push registry服务器:5000/nginxThe push refers to repository [registry服务器:5000/nginx]
    Get https://registry服务器:5000/v2/: http: server gave HTTP response to HTTPS client复制代码

    这是报错了,需要https的方法才能上传,我们可以修改下daemon.json来解决:

    [root@node ~]# vim /etc/docker/daemon.json {  "registry-mirrors": [ "https://registry.docker-cn.com"],  "insecure-registries": [ "registry服务器:5000"]
    }复制代码

    添加私有镜像服务器的地址,注意书写格式为json,有严格的书写要求,然后重启docker服务:
    # systemctl restart docker
    再次上传:

    # docker push registry服务器:5000/nginxThe push refers to repository [registry服务器:5000/nginx]
    d7acf794921f: Pushed
    d9569ca04881: Pushed
    cf5b3c6798f7: Pushed
    kurisu: digest: sha256:079aa93463d2566b7a81cbdf856afc6d4d2a6f9100ca3bcbecf24ade92c9a7fe size: 948复制代码
  5. 测试下载镜像
    上传测试没问题了,我们接下来测试一下从registry服务器上下载刚才上传的busybox镜像,先删除node主机上的镜像:

    # docker rmi -f $(docker images -aq)Untagged: registry服务器:5000/nginx:kurisu
    Untagged: registry服务器:5000/nginx@sha256:079aa93463d2566b7a81cbdf856afc6d4d2a6f9100ca3bcbecf24ade92c9a7fe
    Untagged: nginx:latest
    Untagged: nginx@sha256:bdbf36b7f1f77ffe7bd2a32e59235dff6ecf131e3b6b5b96061c652f30685f3a
    Deleted: sha256:719cd2e3ed04781b11ed372ec8d712fac66d5b60a6fb6190bf76b7d18cb50105
    Deleted: sha256:e9b6506fb887de50972aefd99d7c5eb56b1a8e757ed953cdfecb86b5359bcb22
    Deleted: sha256:55d9d9692a9615a28d183a42bc3881a72a39393feba3664e669e7affb78daa76
    Deleted: sha256:cf5b3c6798f77b1f78bf4e297b27cfa5b6caa982f04caeb5de7d13c255fd7a1e复制代码

    查看一下node主机上的镜像全部删除了:

    # docker imagesREPOSITORY          TAG                 IMAGE ID            CREATED             SIZE复制代码

    然后,从registry服务器上下载nginx镜像:

    # docker pull registry服务器:5000/nginx:kurisukurisu: Pulling from nginxfc7181108d40: Pull complete
    c4277fc40ec2: Pull complete
    780053e98559: Pull complete
    Digest: sha256:079aa93463d2566b7a81cbdf856afc6d4d2a6f9100ca3bcbecf24ade92c9a7fe
    Status: Downloaded newer image for registry服务器:5000/nginx:kurisu复制代码

    查看node主机上的镜像:

    # docker imagesREPOSITORY                 TAG                 IMAGE ID            CREATED             SIZE
    registry服务器:5000/nginx   kurisu              719cd2e3ed04        2 weeks ago         109MB复制代码

查看远程仓库镜像

  • 列出所有镜像:
# curl http://registry服务器:5000/v2/_catalog{"repositories":["nginx"]}复制代码
  • 列出nginx镜像有哪些tag:
# curl http://registry服务器:5000/v2/nginx/tags/list{"name":"nginx","tags":["kurisu"]}复制代码


# docker  # nginx  # json  # cURL  # var  # http  # https  # 镜像  # 这是  # 上传  # 也就  # 我们可以  # 器上  # 台安  # 重启  # 服务端  # 镜像文件 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Win11怎么关闭透明效果_Windows11辅助功能视觉效果设置  详解Oracle修改字段类型方法总结  免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?  制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?  Win11应用商店下载慢怎么办 Win11更改DNS提速下载【修复】  大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?  如何快速搭建自助建站会员专属系统?  悟空浏览器如何设置小说背景色_悟空浏览器背景色设置【方法】  PHP 实现电台节目表的智能时间匹配与今日/明日轮播逻辑  Laravel如何理解并使用服务容器(Service Container)_Laravel依赖注入与容器绑定说明  如何在 Python 中将列表项按字母顺序编号(a.、b.、c. …)  猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  b2c电商网站制作流程,b2c水平综合的电商平台?  高端智能建站公司优选:品牌定制与SEO优化一站式服务  中山网站推广排名,中山信息港登录入口?  音乐网站服务器如何优化API响应速度?  大连 网站制作,大连天途有线官网?  Python自然语言搜索引擎项目教程_倒排索引查询优化案例  CSS3怎么给轮播图加过渡动画_transition加transform实现【技巧】  Laravel如何生成API文档?(Swagger/OpenAPI教程)  canvas 画布在主流浏览器中的尺寸限制详细介绍  网站建设整体流程解析,建站其实很容易!  百度浏览器网页无法复制文字怎么办 百度浏览器复制修复  齐河建站公司:营销型网站建设与SEO优化双核驱动策略  WEB开发之注册页面验证码倒计时代码的实现  为什么要用作用域操作符_php中访问类常量与静态属性的优势【解答】  如何在腾讯云免费申请建站?  手机网站制作与建设方案,手机网站如何建设?  Laravel如何使用软删除(Soft Deletes)功能_Eloquent软删除与数据恢复方法  如何在Windows服务器上快速搭建网站?  北京专业网站制作设计师招聘,北京白云观官方网站?  php结合redis实现高并发下的抢购、秒杀功能的实例  Python正则表达式进阶教程_复杂匹配与分组替换解析  怎样使用JSON进行数据交换_它有什么限制  原生JS获取元素集合的子元素宽度实例  Android仿QQ列表左滑删除操作  详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)  敲碗10年!Mac系列传将迎来「触控与联网」双革新  微信小程序 scroll-view组件实现列表页实例代码  Laravel Seeder填充数据教程_Laravel模型工厂Factory使用  Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑  Windows10怎样连接蓝牙设备_Windows10蓝牙连接步骤【教程】  Laravel如何使用Scope本地作用域_Laravel模型常用查询逻辑封装技巧【手册】  Laravel项目如何进行性能优化_Laravel应用性能分析与优化技巧大全  如何注册花生壳免费域名并搭建个人网站?  如何在自有机房高效搭建专业网站?  laravel怎么实现图片的压缩和裁剪_laravel图片压缩与裁剪方法  如何在景安云服务器上绑定域名并配置虚拟主机?  如何在云主机上快速搭建多站点网站?  网站制作大概要多少钱一个,做一个平台网站大概多少钱?