docker私有镜像仓库+Harbor

Docker Hub

Docker Hub官网:https://hub.docker.com/

目前 Docker 官方维护了一个公共仓库Docker Hub ,大部分需求都可以通过在 Docker Hub 中直接下载镜像来实现。如果你觉得拉取 Docker Hub的镜像比较慢的话,我们可以配置一个镜像加速器,当然国内大部分云厂商都提供了相应的加速器,简单配置即可。

注册
你可以在 https://cloud.docker.com 免费注册一个 Docker 账号。

登录
通过执行docker login 命令交互式的输入用户名及密码来完成在命令行界
面登录 Docker Hub。

注销
你可以通过docker logout 退出登录。 拉取镜像

Registry

有时候使用 Docker Hub 这样的公共仓库可能不方便,用户可以创建一个本地仓库供私人使用。

docker-registry是官方提供的工具,可以用于构建私有的镜像仓库。本文内容基于 docker-registry v2.x 版本。你可以通过获取官方 registry 镜像来运行

一般情况下,不论是通过commit容器得到的镜像,或者是用dockerfile制作的镜像,如果需要将镜像保存,可以使用我们之前提到的导出导入命令(save -o ; load -i)。导出的包,然后再传给其他dockerHost,这种方法也是可行的。

但往往在公司会有大量的镜像,而且不仅仅是单台的dockerHost。我们迫切需要有一个本地的共用的仓库,来实现多台dockerHost直接拉取镜像而不用手动的将镜像穿来穿去,之前的DockerHub可以帮助我们解决这个问题,当然前提需要申请一个DockerHub的账号,创建一个仓库。但这种方法需要消耗我们的带宽,因为是通过网络传输,既然是网络传输,就需要消耗一定的时间。今天说的Registry仓库,是通过一个容器给我们提供的服务,是比较简易的私有仓库,以后在企业中还会有功能更加完善的Harbor仓库。

创建私有仓库

registry是官方提供的工具,可以用于构建私有的镜像仓库。你可以通过获
取官方 registry 镜像来运行。

1)用docker容器运行registry私有仓库服务。
//下载需要的镜像

[root@docker01 ~]# docker pull registry:2

PS:注意,这里我们使用的是registry:2版本,还有一个registry镜像,这两个没有什么大的区别。registry: 是用Python语言写的,registry:2使用Go语言写的,理论上来说,registry:2这个版本运行更快些。

2)运行私有仓库服务

[root@docker01 ~]# docker run -itd --name registry --restart=always -p 5000:5000 -v /registry:/var/lib/registry registry:2

-p: 端口映射。 宿主机端口:容器暴露的端口。

-p 80 : 如果-p选项后边只写了一个端口,那么这个端口是指容器暴露的端口号随机映射到宿主机(32768开始…)

-P :后边没有接任何的端口参数。那么它会把容器暴露的端口,全部随机的映射到宿主机。

-v: 挂载目录。 宿主机的目录:容器内的目录。

3) 镜像重命名
//因为我们使用的私有镜像,在上传或下载的时候,都需要我们将镜像的名称直接重命名,要注明它私有仓库的IP地址:暴露端口。切记是必须,否则将识别不到仓库而上传或下载失败。

格式为 docker tag IMAGE[:TAG]
[REGISTRY_HOST[:REGISTRY_PORT]/]REPOSITORY[:TAG]
[root@docker01 ~]# docker tag registry:2 192.168.1.20:5000/registry

4)编辑docker配置文件
因为docker默认是从dockehub上下载镜像的,需要在本地指定一下私有仓库的IP加端口, 这是因为 Docker 默认不允许非 HTTPS 方式推送镜像。 如果没做这一步,会报HTTPS的错。

//编辑docker的配置文件,指定私有仓库地址

[root@docker01 ~]# vim /usr/lib/systemd/system/docker.service
修改:
ExecStart=/usr/bin/dockerd --insecure-registry 192.168.1.20:5000

修改完要重启

[root@docker01 ~]# systemctl daemon-reload 
[root@docker01 ~]# systemctl restart docker

5)上传私有仓库

[root@docker01 ~]# docker push 192.168.1.20:5000/registry:latest

这里注意,既然是私有仓库,肯定是要考虑多台DockerHost共用的情况,如果有其他的DockerHost想要使用私有仓库,仅需要修改docker的配置文件,指定私有仓库的IP和端口即可。当然别忘了,更改过配置文件之后,daemon-reload ,restart docker服务。

//查看有哪些镜像

[root@docker01 ~]# curl -XGET http://192.168.1.20:5000/v2/_catalog

-X/–request 指定什么命令

-G/–get 以get的方式来发送数据

-E/–cert cert[:passwd] 客户端证书文件和密码 (SSL)

-T/–upload-file 上传文件

[root@docker01 ~]# curl http://192.168.1.20:5000/v2/busybox/tags/list

{
    
    "name":"mycentos","tags":["latest"]} //并看不到详细的自定义 版本号

Harbor

Harbor是构建企业级私有docker镜像的仓库的开源解决方案,它是Docker Registry的更高级封装,它除了提供友好的Web UI界面,角色和用户权限管理,用户操作审计等功能外,它还整合了K8s的插件(Add-ons)仓库,即Helm通过chart方式下载,管理,安装K8s插件,而chartmuseum可以提供存储chart数据的仓库【注:helm就相当于k8s的yum】。另外它还整合了两个开源的安全组件,一个是Notary,另一是Clair,Notary类似于私有CA中心,而Clair则是容器安全扫描工具,它通过各大厂商提供的CVE漏洞库来获取最新漏洞信息,并扫描用户上传的容器是否存在已知的漏洞信息,这两个安全功能对于企业级私有仓库来说是非常具有意义的。

Harbor安装有3种方式:
在线安装:从Docker Hub下载Harbor相关镜像,因此安装软件包非常小

离线安装:安装包包含部署的相关镜像,因此安装包比较大

OVA安装程序:当用户具有vCenter环境时,使用此安装程序,在部署OVA后启动Harbor

本文记录通过离线安装的方式部署。

1、下载一个docker-compse工具。

//从github上下载方法

[root@docker01 ~]# curl -L https://github.com/docker/compose/releases/download/1.25.0 /docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

//这里我准备好了tar包,直接解压即可

[root@docker01 ~]# tar -zxPf docker-compose.1.25.0.tar.gz -C /usr/local/bin/
[root@docker01 ~]# chmod +x /usr/local/bin/docker-compose

//查看版本号,并验证命令可用

[root@docker01 ~]# docker-compose -v
docker-compose version 1.25.0, build 0a186604

//下载依赖包

[root@docker01 ~]# yum -y install yum-utils device-mapper-persistent- data lvm2

2、harbor离线模式

直接在百度搜 harbor进官网 harbor的部署方式,有在线和离线两种方式,考虑到网速原因,这里我们采用离线下载方式。

wget https://storage.googleapis.com/harbor-releases/release-1.7.0/harbor-offline-installer-v1.7.4.tgz

//导入Harbor离线安装包,并解压到/usr/local/下

[root@docker01 ~]# tar -zxf harbor-offline-installer-v1.7.4.tgz -C /usr/local/

//修改配置文件,指定harbor主机

[root@docker01 harbor]# pwd
/usr/local/harbor
[root@docker01 harbor]# vim harbor.cfg
修改:
hostname = 192.168.1.20

这里我们将主机名直接改成我们的IP地址,其实也可以使用域名,如果使用域名需要在windows主机上修改hosts文件,地址为:C:\Windows\System32\drivers\etc,将域名与ip添加进去即可。

# Configuration file of Harbor 

//hostname设置访问地址,可以使用ip、域名,不可以设置为127.0.0.1或 localhost 
hostname = 192.168.1.20 

//访问协议,默认是http,也可以设置https,如果设置https,则nginx ssl需要设置on ui_url_protocol = http 

//最大连接数 
max_job_workers = 10 

//是否生成证书
customize_crt = on 
ssl_cert = /data/cert/server.crt 
ssl_cert_key = /data/cert/server.key 
secretkey_path = /data 
admiral_url = NA 

//关于日志切割选项 
log_rotate_count = 50 

//关于日志切割的大小,可以是KB、MB、GB 
log_rotate_size = 200M 

//是否启用代理访问 
http_proxy = 
https_proxy = 
no_proxy = 127.0.0.1,localhost,core,registry 

//邮件设置,发送重置密码邮件时使用 
email_identity =
email_server = smtp.mydomain.com 
email_server_port = 25 
email_username = [email protected] 
email_password = abc 
email_from = admin <[email protected]> 
email_ssl = false 
email_insecure = false 

//启动Harbor后,管理员admin,UI登录的密码,默认是Harbor12345 
harbor_admin_password = Harbor12345 

//认证方式,这里支持多种认证方式,如LADP、本次存储、数据库认证。默认是 db_auth,mysql数据库认证 
auth_mode = db_auth 

是否开启自注册 
self_registration = on 

//token有效时间,默认30分钟 
token_expiration = 30 

//用户创建项目权限控制,默认是everyone(所有人),也可以设置为 adminonly(只能管理员) project_creation_restriction = everyone

// 修改完配置文件后,在的当前目录执行./install.sh,Harbor服务就会根据当期目录下的docker-compose.yml开始下载依赖的镜像,检测并按照顺序依次启动,并且注意,harbor默认使用的是80端口,最好确认是否有冲突,或者也可以在docker-compose.yml中修改对应的端口

[root@docker01 harbor]# ./install.sh

在这里插入图片描述

查看和监控**

[root@docker01 ~]# docker ps
CONTAINER ID        IMAGE                                    COMMAND                  CREATED             STATUS                   PORTS                                                              NAMES
fe15165d428c        goharbor/nginx-photon:v1.7.4             "nginx -g 'daemon of…"   3 minutes ago       Up 3 minutes (healthy)   0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp, 0.0.0.0:4443->4443/tcp   nginx
9a7fe804b8c0        goharbor/harbor-portal:v1.7.4            "nginx -g 'daemon of…"   3 minutes ago       Up 3 minutes (healthy)   80/tcp                                                             harbor-portal
bdb281280efb        goharbor/harbor-jobservice:v1.7.4        "/harbor/start.sh"       3 minutes ago       Up 3 minutes                                                                                harbor-jobservice
61ed86617085        goharbor/harbor-core:v1.7.4              "/harbor/start.sh"       3 minutes ago       Up 3 minutes (healthy)                                                                      harbor-core
b92102e4d41d        goharbor/redis-photon:v1.7.4             "docker-entrypoint.s…"   3 minutes ago       Up 3 minutes             6379/tcp                                                           redis
f32429ed639c        goharbor/harbor-adminserver:v1.7.4       "/harbor/start.sh"       3 minutes ago       Up 3 minutes (healthy)                                                                      harbor-adminserver
c7f21c38122d        goharbor/registry-photon:v2.6.2-v1.7.4   "/entrypoint.sh /etc…"   3 minutes ago       Up 3 minutes (healthy)   5000/tcp                                                           registry
f3aedb9740de        goharbor/harbor-db:v1.7.4                "/entrypoint.sh post…"   3 minutes ago       Up 3 minutes (healthy)   5432/tcp                                                           harbor-db
5f1012494f46        goharbor/harbor-registryctl:v1.7.4       "/harbor/start.sh"       3 minutes ago       Up 3 minutes (healthy)                                                                      registryctl
dae5e4ff55e1        goharbor/harbor-log:v1.7.4               "/bin/sh -c /usr/loc…"   3 minutes ago       Up 3 minutes (healthy)   127.0.0.1:1514->10514/tcp 

//docker-compose这个命令可以管理harbor服务,不过需要注意的是想使用以下命令,必须是和docker-compose.yml这个文件在同一个目录下,其实就是通过管理这个文件而管理harbor仓库的.

启动harbor: docker-compose start 
停止harbor: docker-compose stop 
重启harbor: docker-compose restart

harbor使用

启动harbor
在这里插入图片描述
Proxy:他是一个nginx的前端代理,代理Harbor的registry,UI,token等服务。

db:负责储存用户权限、审计日志、Dockerimage分组信息等数据。

UI:提供图形化界面,帮助用户管理registry上的镜像, 并对用户进行授权。

jobsevice:jobsevice是负责镜像复制工作的,他和registry通信,从一个registry pull镜像然后push到另一个registry,并记录job_log。

Adminserver:是系统的配置管理中心附带检查存储用量,ui和jobserver启动时候回需要加载adminserver的配置。

Registry:镜像仓库,负责存储镜像文件。

Log:为了帮助监控Harbor运行,负责收集其他组件的log,供日
后进行分析。

//这时我们可以通过浏览器访问了。
在这里插入图片描述
默认用户名:admin
密码:Harbor12345

//新建仓库
在这里插入图片描述
在这里插入图片描述

docker client的设置

1、更改docker配置文件
//同理因为docker不支持https的原因,我们也需要将docker的配置文件进行更改。

[root@docker02 ~]# vim /usr/lib/systemd/system/docker.service
... 
ExecStart=/usr/bin/dockerd --insecure-registry 192.168.1.20 
... 
[root@docker02 ~]# systemctl daemon-reload 
[root@docker02 ~]# systemctl restart docker

2、客户端登陆

[root@docker02 ~]#  docker login -u admin -p Harbor12345 192.168.1.20
Login Succeeded

3、上传私有镜像

[root@docker02 ~]# docker tag nginx:latest 192.168.1.20/bdqn/nginx:v1.0
[root@docker02 ~]# docker push 192.168.1.20/bdqn/nginx:v1.0 
The push refers to repository [192.168.1.20/bdqn/nginx]
85fcec7ef3ef: Pushed 
3e5288f7a70f: Pushed 
56bc37de0858: Pushed 
1c91bf69a08b: Pushed 
cb42413394c4: Pushed 
v1.0: digest: sha256:0b159cd1ee1203dad901967ac55eee18c24da84ba3be384690304be93538bea8 size: 1362

//然后浏览器就可以查看到对应的镜像

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/hjyhjy0/article/details/113727377