podman加速配置、harbor镜像仓库的部署

  • 1. podman镜像加速配置
  • 2. harbor镜像仓库部署
  • 2.1 harbor简介
  • 2.3 Harbor的功能
  • 2.4 Docker compose
  • 2.2 Harbor的架构
  • 2.3 Docker Registry
  • 2.4 Docker Private Registry
  • 2.5 使用docker-distribution自建Registry
  • 使用官方镜像自建Registry
  • 3. Harbor部署
  • 设置docker-compose开机自启


1. podman镜像加速配置

镜像加速可以使用阿里云、清华大学、网易等多个镜像加速,这里我们使用阿里云的镜像加速。
前提需要你先登录,才可以获取你的镜像加速的地址阿里云镜像加速地址清华大学镜像加速网易镜像加速

// 修改配置文件
此配置是在centos8里面,跟7有点不同

[root@localhost containers]# pwd
/etc/containers
[root@localhost containers]# vim registries.conf  
[registries.search]  //默认是通过https去访问docker官网
unqualified-search-registries = ["registry.fedoraproject.org", "registry.access.redhat.com", "registry.centos.org", "docker.io"]  //只留docker.io,7版本面只有3个,8才有4个
unqualified-search-registries = ["docker.io"]

[registries.insecure]  //这种方式默认是通过http去访问官网
registries = [docker.io]

[root@localhost containers]# podman pull centos  //直接使用pul去拉取镜像他默认就回去docker的官方仓库去拉取。
Resolved "centos" as an alias (/etc/containers/registries.conf.d/000-shortnames.conf)
Trying to pull quay.io/centos/centos:latest...
Getting image source signatures
Copying blob 7a0437f04f83 done  
Copying config 300e315adb done  
Writing manifest to image destination
Storing signatures
300e315adb2f96afe5f0b2780b87f28ae95231fe3bdd1e16b9ba606307728f55

// 这是8的配置方法,7跟8有所不同
[root@localhost containers]# vim registries.conf
35 [[registry]]
 36 prefix="docker.io"
 37 location="这个地方写你的镜像加速的地址,不需要httpds"

// 7的配置方法
[root@localhost containers]# vim registries.conf  //就是不需要写prefix这个东西
[[docker.io]]
location="这个地方写你的镜像加速的地址,不需要httpds"

2. harbor镜像仓库部署

2.1 harbor简介

它以Docker公司开源的registry为基础,提供了管理UI,基于角色的访问控制(Role Based Access Control),AD/LDAP集成、以及审计日志(Auditlogging) 等企业用户需求的功能。

简单说来,Harbor封装了Docker的registry v2,帮用户提供了许多便捷管理的特性,方便用户操作。

Harbor是由VMWare在Docker Registry的基础之上进行了二次封装,加进去了很多额外程序,而且提供了一个非常漂亮的web界面。
Project Harbor 是一个开源可信云原生的本地存储仓库,用来存储、签名和查看镜像

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

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

2.3 Harbor的功能

Feathers:

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

2.4 Docker compose

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

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

Docker Compose官方文档

2.2 Harbor的架构

pod切换镜像 podman 构建镜像_pod切换镜像

主要组件包括proxy,他是一个nginx前端代理,主要是分发前端页面ui访问和镜像上传和下载流量,上图中通过深蓝色先标识;ui提供了一个web管理页面,当然还包括了一个前端页面和后端API,底层使用mysql数据库;registry是镜像仓库,负责存储镜像文件,当镜像上传完毕后通过hook通知ui创建repository,上图通过红色线标识,当然registry的token认证也是通过ui组件完成;adminserver是系统的配置管理中心附带检查存储用量,ui和jobserver启动时候回需要加载adminserver的配置,通过灰色线标识;jobsevice是负责镜像复制工作的,他和registry通信,从一个registry pull镜像然后push到另一个registry,并记录job_log,上图通过紫色线标识;log是日志汇总组件,通过docker的log-driver把日志汇总到一起,通过浅蓝色线条标识。

2.3 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。

2.4 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软件。

2.5 使用docker-distribution自建Registry

环境说明:

系统版本

主机名称

centos7

localhost,IP地址192.168.182.131

centos7

client,IP地址192.168.182.132

[root@localhost ~]# yum -y install docker-distribution

[root@localhost ~]# 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@localhost ~]# systemctl start docker-distribution.service 
[root@localhost ~]# ss -anlt
State       Recv-Q Send-Q                                                         Local Address:Port                                                                        Peer Address:Port              
LISTEN      0      128                                                                        *:22                                                                                     *:*                  
LISTEN      0      128                                                                       :::5000                                                                                  :::*                  
LISTEN      0      128                                                                       :::22  

// 在client端要安装docker
[root@client ~]# cat /etc/docker/daemon.json //此文件默认没有需要创建
{
"insecure-registries": ["192.168.182.131:5000"]
}

[root@client ~]# systemctl restart docker.service
[root@client ~]# docker images 
REPOSITORY   TAG       IMAGE ID       CREATED      SIZE
busybox      latest    ffe9d497c324   7 days ago   1.24MB

[root@client ~]# docker tag busybox:latest localhost-linux.example.com:5000/busybox:latest  //将镜像的名称修改为与["192.168.182.131:5000"]保持一致,这样是为了上传镜像

[root@client ~]# docker image push 192.168.182.131:5000/busybox:latest 
The push refers to repository [192.168.182.131:5000/busybox]
64cac9eaf0da: Pushed 
latest: digest: sha256:50e44504ea4f19f141118a8a8868e6c5bb9856efa33f2183f5ccea7ac62aacc9 size: 527


// 在此/var/lib/registry目录下可以看到镜像,在localhost上查看
[root@localhost registry]# tree 
.
└── docker
    └── registry
        └── v2
            ├── blobs
            │   └── sha256
            │       ├── 3c
            │       │   └── 3cb635b06aa273034d7080e0242e4b6628c59347d6ddefff019bfd82f45aa7d5
            │       │       └── data
            │       ├── 50
            │       │   └── 50e44504ea4f19f141118a8a8868e6c5bb9856efa33f2183f5ccea7ac62aacc9
            │       │       └── data
            │       └── ff
            │           └── ffe9d497c32414b1c5cdad8178a85602ee72453082da2463f1dede592ac7d5af
            │               └── data
            └── repositories
                └── busybox
                    ├── _layers
                    │   └── sha256
                    │       ├── 3cb635b06aa273034d7080e0242e4b6628c59347d6ddefff019bfd82f45aa7d5
                    │       │   └── link
                    │       └── ffe9d497c32414b1c5cdad8178a85602ee72453082da2463f1dede592ac7d5af
                    │           └── link
                    ├── _manifests
                    │   ├── revisions
                    │   │   └── sha256
                    │   │       └── 50e44504ea4f19f141118a8a8868e6c5bb9856efa33f2183f5ccea7ac62aacc9
                    │   │           └── link
                    │   └── tags
                    │       └── latest
                    │           ├── current
                    │           │   └── link
                    │           └── index
                    │               └── sha256
                    │                   └── 50e44504ea4f19f141118a8a8868e6c5bb9856efa33f2183f5ccea7ac62aacc9
                    │                       └── link
                    └── _uploads

从上面我们可以看出这种方式创建的镜像仓库十分简陋,且复杂

使用官方镜像自建Registry

[root@server ~]# docker run -d -p 5001:5000 -v /var/lib/registry:/tmp/registry registry  //使用registry镜像创建一个容器用来搭建

[root@server ~]# ss -anlt
State       Recv-Q Send-Q                                                         Local Address:Port                                                                        Peer Address:Port              
LISTEN      0      128                                                                        *:5001                                                                                   *:*                  
LISTEN      0      128                                                                        *:22                                                                                     *:*                  
LISTEN      0      128                                                                       :::5000                                                                                  :::*                  
LISTEN      0      128                                                                       :::5001                                                                                  :::*                  
LISTEN      0      128                                                                       :::22

3. Harbor部署

环境说明: 系统版本centos8

Harbor官方文档及源码包下载地址

// 先安装docker
[root@registry ~]# yum -y install yum-utils  
[root@localhost ~]# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
[root@registry ~]# sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo

[root@registry ~]# yum -y install docker-ce docker-ce-cli containerd.io

// 安装docker-compose
以下两种方法均可,第一种方法需要安装以下依赖
[root@registry ~]# yum -y install epel-release
[root@registry ~]# yum -y install python3
[root@registry ~]# yum -y install python3-paramiko
[root@registry ~]# pip3 install docker-compose

[root@registry ~]# curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

// 如果在/usr/local/bin下找不到docker-compose可以使用以下方法
[root@registry bin]# ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

// 赋予执行权限
[root@registry ~]# chmod +x /usr/local/bin/docker-compose

// 下载harbor包
[root@localhost ~]# wget https://github.com/goharbor/harbor/archive/refs/tags/v2.3.5.tar.gz


// 解压包
[root@registry ~]# tar xf harbor-offline-installer-v2.3.5.tgz -C /usr/local/ 

// 因为没有harbor.yml文件所以需要我们手动生成
[root@registry harbor]# pwd
/usr/local/harbor
[root@registry harbor]# cp harbor.yml.tmpl harbor.yml

[root@registry bin]# hostname registry.example.com

[root@registry bin]# vim /etc/hosts
192.168.182.151 registry.example.com //添加此行内容IP为本机IP

[root@localhost ~]# vim /etc/hosts
192.168.182.151 registry.example.com

// 修改配置文件
[root@registry harbor]# pwd
/usr/local/harbor
[root@registry harbor]# vim harbor.yml
  5 hostname: registry.example.com  //修改额此行内容,也是用来访问仓库的
  // 因为这个基于https访问的,因为我们现在还没有配置https所以需要注释掉
#https:
  # https port for harbor, default is 443
  #port: 443
  # The path of cert and key files for nginx
  #certificate: /your/certificate/path
  #private_key: /your/private/key/path

 34 harbor_admin_password: Harbor12345  //这个地方是管理员的密码,用户的admin,用来登录web界面,可以自定义密码
 47 data_volume: /data  //数据存放目录
 
 // 执行脚本安装harbor仓库
 [root@registry harbor]# pwd
/usr/local/harbor
[root@registry harbor]# ./install.sh 
省略N行
Creating network "harbor_harbor" with the default driver
Creating harbor-log ... done
Creating redis         ... done
Creating registryctl   ... done
Creating harbor-portal ... done
Creating harbor-db     ... done
Creating registry      ... done
Creating harbor-core   ... done
Creating harbor-jobservice ... done
Creating nginx             ... done
✔ ----Harbor has been installed and started successfully.----

通过IP地址进行访问

使用Harbor的注意事项:

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

pod切换镜像 podman 构建镜像_docker_02

// 可以用来切换颜色

pod切换镜像 podman 构建镜像_docker_03

// 也可以根据需求来选择语言

pod切换镜像 podman 构建镜像_docker_04

// 镜像仓库的名称,权限是公开的所有人都可以访问,可以通过NEW PROJECT

pod切换镜像 podman 构建镜像_Docker_05

注意:在客户端使用的时候如果不是用的https则必须要在客户端的/etc/docker/daemon.json配置文件中配置insecure-registries参数

[root@localhost ~]# vim /etc/docker/daemon.json
{
  "insecure-registries":["registry.example.com"]
}
[root@localhost ~]# systemctl daemon-reload  //重新加载
[root@localhost ~]# systemctl restart docker.service  //重启docker服务

// 上传镜像进行测试

[root@localhost ~]# docker login registry.example.com  //首先登录到仓库
Username: admin  //账号
Password:   //密码
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

[root@localhost ~]# docker tag busybox:latest registry.example.com/library/busybox:v1.0  //将busybox改名与仓库名称一样,这样才能上传,这里的library是harbar里面的那个镜像仓库

[root@localhost ~]# docker push registry.example.com/library/busybox:v1.0 
The push refers to repository [registry.example.com/library/busybox]
9f2549622fec: Pushed 
v1.0: digest: sha256:d5c6e74e3115b55dce759c1b3a52b1d2db60dc6929681de2f76cdc5d6f4d7412 size: 527

// 上传成功

pod切换镜像 podman 构建镜像_Docker_06

设置docker-compose开机自启

// 在此目录下编写一个脚本用来启动服务
/etc/rc.d/init.d/目录下的脚本就类似与windows中的注册表,在系统启动的时候某些指定脚本将被执行

[root@registry ~]# cd /etc/rc.d/init.d/
[root@registry init.d]# cat start.sh 
#!/bin/bash
/usr/local/harbor/docker-compose start