Docker Private Registry

Docker Registry

网上有很多的Registry服务器都支持第三方用户注册,而后基于用户名去做自己的仓库,但是使用互联网上的Registry有一个缺陷,那就是我们去推送和下载镜像时都不会很快,而在生产环境中很可能并行启动的容器将达到几十、上百个,而且很有可能每个服务器本地是没有镜像的,此时如果通过互联网去下载镜像会有很多问题,比如下载速度会很慢、带宽会用很多等等,如果带宽不够的话,下载至启动这个过程可能要持续个几十分钟,这已然违背了使用容器会更加轻量、快速的初衷和目的。因此,很多时候我们很有可能需要去做自己的私有Registry

Registry用于保存docker镜像,包括镜像的层次结构和元数据。用户可以自建Registry,也可以使用官方的Docker Hub

Docker Registry分类:

  • Sponsor Registry:第三方的Registry,供客户和Docker社区使用
  • Mirror Registry:第三方的Registry,只让客户使用
  • Vendor Registry:由发布docker镜像的供应商提供的registry
  • Private Registry:通过设有防火墙和额外的安全层的私有实体提供的registry

事实上,如果运维的系统环境托管在云计算服务上,比如阿里云,那么用阿里云的Registry则是最好的选择。很多时候我们的生产环境不会在本地,而是托管在数据中心机房里,如果我们在数据中心机房里的某台主机上部署Registry,因为都在同一机房,所以属于同一局域网,此时数据传输走内网,效率会极大的提升。

所有的Registry默认情况下都是基于https工作的,这是Docker的基本要求,而我自建Registry时很可能是基于http工作的,但是Docker默认是拒绝使用http提供Registry服务的,除非明确的告诉它,我们就是要用http协议的Registry

Docker Private Registry

为了帮助我们快速创建私有Registry,Docker专门提供了一个名为Docker Distribution的软件包,我们可以通过安装这个软件包快速构建私有仓库。

问:既然Docker是为了运行程序的,Docker Distribution能否运行在容器中?

容器时代,任何程序都应该运行在容器中,除了Kernel和init。而为了能够做Docker Private Registry,Docker Hub官方直接把Registry做成了镜像,我们可以直接将其pull到本地并启动为容器即可快速实现私有Registry

Registry的主要作用是托管镜像,Registry运行在容器中,而容器自己的文件系统是随着容器的生命周期终止和删除而被删除的,所以当我们把Registry运行在容器中时,客户端上传了很多镜像,随着Registry容器的终止并删除,所有镜像都将化为乌有,因此这些镜像应该放在存储卷上,而且这个存储卷最好不要放在Docker主机本地,而应该放在一个网络共享存储上,比如NFS。不过,镜像文件自己定义的存储卷,还是一个放在Docker本地、Docker管理的卷,我们可以手动的将其改成使用其它文件系统的存储卷。

这就是使用容器来运行Registry的一种简单方式。自建Registry的另一种方式,就是直接安装docker-distribution软件。

使用docker-distribution自建Registry

在rh2上自建Registry

[root@rh2 ~]# dnf -y install http://mirror.centos.org/centos/7/extras/x86_64/Packages/docker-distribution-2.6.2-2.git48294d9.el7.x86_64.rpm			#安装
[root@rh2 ~]# vim /etc/docker-distribution/registry/config.yml #编辑配置文件 version: 0.1
log:
fields:
service: registry
storage:
cache:
layerinfo: inmemory
filesystem:
rootdirectory: /var/lib/registry #根目录位置,可以自定义,这里默认不做更改
http:
addr: :5000
[root@rh2 ~]# systemctl start docker-distribution.service #启动
[root@rh2 ~]# ss -tanl #查看端口
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 128 *:5000 *:*
LISTEN 0 128 [::]:22 [::]:*
[root@rh2 ~]# systemctl stop firewalld.service #因为需要允许和rh1进行传输镜像,所以暂时关闭防火墙

在rh1上使用自建的Registry去上传镜像

[root@rh1 ~]# vim /etc/docker/daemon.json 

{
"registry-mirrors": ["https://rpnfe8c5.mirror.aliyuncs.com"],
"insecure-registries": ["192.168.244.121:5000"] #这里的IP和端口为rh2的IP和Registry服务开放的端口
}
[root@rh1 ~]# systemctl daemon-reload #重新加载配置文件
[root@rh1 ~]# systemctl restart docker.service #重启docker服务
[root@rh1 ~]# docker images #查看当前所拥有的镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox latest beae173ccac6 7 months ago 1.24MB
[root@rh1 ~]# docker tag busybox:latest 192.168.244.121:5000/busybox:v1 #给需要上传的镜像打上标签
[root@rh1 ~]# docker push 192.168.244.121:5000/busybox:v1 #上传该镜像
The push refers to repository [192.168.244.121:5000/busybox]
01fd6df81c8e: Pushed
v1: digest: sha256:62ffc2ed7554e4c6d360bce40bbcf196573dd27c4ce080641a2c59867e732dee size: 527

使用官方镜像自建Registry

在rh2上使用官方镜像自建Registry

[root@rh2 ~]# systemctl stop docker-distribution.service 		#关掉先前的服务,让5000端口不被占用
[root@rh2 ~]# docker pull registry #拉取registry镜像
Using default tag: latest
latest: Pulling from library/registry
213ec9aee27d: Pull complete
5299e6f78605: Pull complete
4c2fb79b7ce6: Pull complete
74a97d2d84d9: Pull complete
44c4c74a95e4: Pull complete
Digest: sha256:83bb78d7b28f1ac99c68133af32c93e9a1c149bcd3cb6e683a3ee56e312f1c96
Status: Downloaded newer image for registry:latest
docker.io/library/registry:latest
[root@rh2 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
registry latest 3a0f7b0a13ef 33 hours ago 24.1MB
[root@rh2 ~]# vim /etc/docker/daemon.json
{
"insecure-registries": ["192.168.244.120:5000"] #同样的,添加这一行配置文件 }
[root@rh2 ~]# ss -tanl #查看5000端口是否开启
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 0.0.0.0:5000 0.0.0.0:*
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 128 [::]:5000 [::]:*
LISTEN 0 128 [::]:22 [::]:*

在rh1上上传镜像

[root@rh1 ~]# docker tag busybox:latest 192.168.244.121:5000/abc:v1		#先打上标签
[root@rh1 ~]# docker push 192.168.244.121:5000/abc:v1 #再进行上传
The push refers to repository [192.168.244.121:5000/abc]
01fd6df81c8e: Pushed
v1: digest: sha256:62ffc2ed7554e4c6d360bce40bbcf196573dd27c4ce080641a2c59867e732dee size: 527
[root@rh1 ~]# curl http://192.168.244.121:5000/v2/_catalog #查看rh2上私有仓库镜像
{"repositories":["abc"]}
[root@rh1 ~]# curl http://192.168.244.121:5000/v2/abc/tags/list #查看该镜像版本
{"name":"abc","tags":["v1"]}

Harbor

无论是使用Docker-distribution去自建仓库,还是通过官方镜像跑容器的方式去自建仓库,通过前面的演示我们可以发现其是非常的简陋的,还不如直接使用官方的Docker Hub去管理镜像来得方便,至少官方的Docker Hub能够通过web界面来管理镜像,还能在web界面执行搜索,还能基于Dockerfile利用Webhooks和Automated Builds实现自动构建镜像的功能,用户不需要在本地执行docker build,而是把所有build上下文的文件作为一个仓库推送到github上,让Docker Hub可以从github上去pull这些文件来完成自动构建。

但无论官方的Docker Hub有多强大,它毕竟是在国外,所以速度是最大的瓶颈,我们很多时候是不可能去考虑使用官方的仓库的,但是上面说的两种自建仓库方式又十分简陋,不便管理,所以后来就出现了一个被 CNCF 组织青睐的项目,其名为Harbor。

Harbor简介

Harbor是由VMWare在Docker Registry的基础之上进行了二次封装,加进去了很多额外程序,而且提供了一个非常漂亮的web界面。

‎Project Harbor 是一个开源的可信云原生注册表项目,用于存储、签名和扫描上下文。‎

‎Harbor 通过添加用户通常需要的功能(如安全性、身份和管理)来扩展开源 Docker 分发版。‎

‎Harbor 支持高级功能,例如用户管理、访问控制、活动监控和实例间复制。‎

Harbor的功能

Feathers:

  • ‎多用户内容签名和验证‎
  • ‎安全性和漏洞分析‎
  • ‎审核日志记录‎
  • ‎身份集成和基于角色的访问控制‎
  • ‎实例之间的镜像复制‎
  • ‎可扩展的 API 和图形用户界面‎
  • ‎国际化(现为英文和中文)‎

Docker compose

Harbor在物理机上部署是非常难的,而为了简化Harbor的应用,Harbor官方直接把Harbor做成了在容器中运行的应用,而且这个容器在Harbor中依赖类似redis、mysql、pgsql等很多存储系统,所以它需要编排很多容器协同起来工作,因此VMWare Harbor在部署和使用时,需要借助于Docker的单机编排工具(Docker compose)来实现。

‎Compose 是用于定义和运行多容器 Docker 应用程序的工具。使用 Compose,您可以使用 YAML 文件来配置应用程序的服务。然后,使用单个命令,从配置中创建并启动所有服务。‎

Docker Compose官方文档

Harbor部署

Harbor官方文档

[root@rh1 ~]# curl -SL https://github.com/docker/compose/releases/download/v2.7.0/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose		#下载docker-compose到指定目录下
[root@rh1 ~]# cd /usr/local/bin/
[root@rh1 bin]# ls
docker-compose
[root@rh1 bin]# chmod +x docker-compose #没有执行权限要添加执行权限
[root@rh1 bin]# which docker-compose
/usr/local/bin/docker-compose
[root@rh1 bin]# docker-compose -v #查看版本,确认无误
Docker Compose version v2.7.0
[root@rh1 ~]# wget https://github.com/goharbor/harbor/releases/download/v2.4.3/harbor-offline-installer-v2.4.3.tgz #下载harbor包
[root@rh1 ~]# ls #查看是否下载成功
harbor-offline-installer-v2.4.3.tgz
[root@rh1 ~]# tar -xf harbor-offline-installer-v2.4.3.tgz -C /usr/local/ #解压到指定目录
[root@rh1 ~]# ls /usr/local/ #查看是否有harbor目录
bin etc games harbor include lib lib64 libexec sbin share src
[root@rh1 ~]# cd /usr/local/harbor/
[root@rh1 harbor]# ls
common.sh harbor.v2.4.3.tar.gz harbor.yml.tmpl install.sh LICENSE prepare
[root@rh1 harbor]# mv harbor.yml.tmpl harbor.yml #将模板文件重命名
[root@rh1 harbor]# vim harbor.yml #编辑配置文件
***
hostname: 192.168.244.120
***
# https related config
#https:
# https port for harbor, default is 443 #因为我们使用的是私有仓库,无需连接公网,所以注释掉https相关配置
#port: 443
# The path of cert and key files for nginx
#certificate: /your/certificate/path
#private_key: /your/private/key/path
*****
harbor_admin_password: Harbor12345 #此行为管理员admin默认密码 [root@rh1 ~]# cd /etc/docker/
[root@rh1 docker]# vim daemon.json {
"registry-mirrors": ["https://rpnfe8c5.mirror.aliyuncs.com"],
"insecure-registries": ["192.168.244.120"] #主机及时修改回本机ip
}
[root@rh1 docker]# systemctl daemon-reload
[root@rh1 ~]# cd /usr/local/harbor/
[root@rh1 harbor]# ./install.sh #启动服务
******
[Step 5]: starting Harbor ...
[+] Running 10/10
⠿ Network harbor_harbor Created 1.0s
⠿ Container harbor-log Started 1.1s
⠿ Container harbor-portal Started 3.2s
⠿ Container redis Started 2.7s
⠿ Container registryctl Started 3.0s
⠿ Container harbor-db Started 3.2s
⠿ Container registry Started 3.2s
⠿ Container harbor-core Started 3.8s
⠿ Container nginx Started 5.1s
⠿ Container harbor-jobservice Started 5.0s
----Harbor has been installed and started successfully.----

设置开机重启

[root@rh1 ~]# cd /usr/local/harbor/
[root@rh1 harbor]# vim starthb.sh #编辑重启脚本
#! /bin/bash
cd /usr/local/harbor
/usr/local/bin/docker-compose stop
/usr/local/bin/docker-compose start
[root@rh1 harbor]# chmod +x starthb.sh #为该脚本添加执行权限
[root@rh1 harbor]# ll starthb.sh
-rwxr-xr-x. 1 root root 105 8月 11 09:44 starthb.sh
[root@rh1 harbor]# vim /etc/rc.d/rc.local #在该配置文件中插入使用的shell和脚本路径
/bin/bash /usr/local/harbor/starthb.sh
[root@rh1 ~]# cd /etc/rc.d/
[root@rh1 rc.d]# chmod +x rc.local #为改文件添加执行权限
[root@rh1 ~]# reboot #重启测试
[root@rh1 ~]# docker ps | wc -l #查看是否自动启动所有容器
10

测试:

使用admin账户登录

创建用户

使用Harbor的注意事项:

  1. 在客户端上传镜像时一定要记得执行docker login进行用户认证,否则无法直接push
  2. 在客户端使用的时候如果不是用的https则必须要在客户端的/etc/docker/daemon.json配置文件中配置insecure-registries参数
  3. 数据存放路径应在配置文件中配置到一个容量比较充足的共享存储中
  4. Harbor是使用docker-compose命令来管理的,如果需要停止Harbor也应用docker-compose stop来停止,其他参数请--help

Docker Private Registry的更多相关文章

  1. Docker Private Registry 常用组件

    Docker Private Registry 常用组件 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Docker Registry概述 1>.什么是registry ...

  2. 基于IP的docker private registry 私有仓库的搭建

    鉴于国内的网络环境,如果公司内部大量使用docker,镜像上传下载将是个非常耗时的工作,搭建一个私有仓库可以很好的解决自有镜像的存储,如果你在私有网络,不能使用域名的话,那么本文可以作为一个很好的例子 ...

  3. docker private registry使用

    一.搭建harbor: 步骤:略 二.命令行操作: 登录:docker login docker01 tag image: tag 一个 image,名称一定要标准( registryAddress[ ...

  4. Docker学习记录3: 搭建 Private Registry

    恩, Private Registry 特别好搭建, 只要依照官方文档, 很容易安装... https://docs.docker.com/registry/deploying/ 5000是个常用的端 ...

  5. Docker部署Registry私有镜像库

    拉取镜像 docker pull registry:2.6.2   生成账号密码文件,这里采用htpasswd方式认证 docker run --rm --entrypoint htpasswd re ...

  6. Docker 利用registry创建私有仓库

    一.Docker-registry镜像 下载地址 官方镜像下载比较慢,因为人品问题一直下载不成功,所以选择了国内的镜像. daocloud:   https://hub.daocloud.io/ 还有 ...

  7. 基于Harbor和CephFS搭建高可用Private Registry

    我们有给客户搭建私有容器仓库的需求.开源的私有容器registry可供选择的不多,除了docker官方的distribution之外,比较知名的是VMware China出品的Harbor,我们选择了 ...

  8. 7.docker私有registry

    一.Docker Registry分类 Registry用于保存docker镜像,包括镜像的层次结构和元数据.都是基于https或者http工作的. 用户可自建Registry,也可使用官方的Dock ...

  9. docker简单介绍---部署私有docker仓库Registry

    1. 关于Registry 官方的Docker hub是一个用于管理公共镜像的好地方,我们可以在上面找到我们想要的镜像,也可以把我们自己的镜像推送上去.但是,有时候,我们的使用场景需要我们拥有一个私有 ...

随机推荐

  1. 在阿里云Centos7.6上面配置Mysql主从数据库(master/slave),实现读写分离

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_85 在之前的一篇文章中,阐述了如何在高并发高负载的场景下使用nginx做后台服务的负载均衡:在阿里云Centos上配置nginx+ ...

  2. 从零开始Blazor Server(9)--修改Layout

    目前我们的MainLayout还是默认的,这里我们需要修改为BootstrapBlazor的Layout,并且处理一下菜单. 修改MainLayout BootstrapBlazor已经自带了一个La ...

  3. Taurus.MVC 微服务框架 入门开发教程:项目部署:1、微服务应用程序常规部署实现多开,节点扩容。

    系列目录: 本系列分为项目集成.项目部署.架构演进三个方向,后续会根据情况调整文章目录. 本系列第一篇:Taurus.MVC V3.0.3 微服务开源框架发布:让.NET 架构在大并发的演进过程更简单 ...

  4. Vim配置文件-详解(.vimrc)

    Vim配置文件的作用 Vim启动时,会根据配置文件(.vimrc)来设置 Vim,因此我们可以通过此文件来定制适合自己的 Vim Vim分类 系统Vim配置文件/etc/vimrc 所有系统用户在启动 ...

  5. Bert不完全手册7. 为Bert注入知识的力量 Baidu-ERNIE & THU-ERNIE & KBert

    借着ACL2022一篇知识增强Tutorial的东风,我们来聊聊如何在预训练模型中融入知识.Tutorial分别针对NLU和NLG方向对一些经典方案进行了分类汇总,感兴趣的可以去细看下.这一章我们只针 ...

  6. kafka报错 日志压缩报错直接退出

    Resetting  first dirty ofset to log start  offset 2971862 since the checkpointed offset 12675089 is ...

  7. Hive存储格式之ORC File详解,什么是ORC File

    目录 概述 文件存储结构 Stripe Index Data Row Data Stripe Footer 两个补充名词 Row Group Stream File Footer 条纹信息 列统计 元 ...

  8. 痞子衡嵌入式:MCUXpresso IDE下设置代码编译优化等级的几种方法

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是MCUXpresso IDE下设置代码编译优化等级的几种方法. 最近公司芯片设计团队正在开发一款全新的基于 Cortex-M33 内核的 ...

  9. 【MySQL】从入门到掌握3-WorkBench

    上期:[MySQL]从入门到掌握2-下载安装 我们安装完MySQL Server的时候,是没有任何界面的. 不过很好,我们有一个工具,MySQL Workbench,他可以简化我们的操作,有点像Jav ...

  10. C++ 对于函数名的操作,函数名本身和取*以及取&的区别

    void TestFunc() { } int _tmain(int argc, _TCHAR* argv[]) { cout<<TestFunc<<endl; cout< ...