docker-review2:docker私人仓库,harbor

1. docker仓库概念

docker container针对容器操作,docker image针对镜像操作,docker net针对网路进行操作,docker volume针对数据卷进行操作

  • docker仓库时用来包含镜像的位置,docker官方提供一个注册服务器(Register)来保存多个仓库,每个仓库又可以包含多个具备不同tag的镜像
  • docker运行中默认使用的仓库是docker hub公共仓库,可以直接serch,pull,push;可通过docker info查看使用的仓库情况,此处使用了阿里云的镜像加速
    请添加图片描述
  • 下载不需要登陆,上传镜像资源需要先认证,在docker官网先注册
  • Docker Hub是docker公司维护的的公共仓库,用户可以免费使用,也可以购买私有仓库;建议自己搭建一个私有仓库
  • 官方仓库为区分不同用户的同名镜像,要求的镜像格式是:[username]/xxx.tag
  • 上传前需要先登陆:docker login
    请添加图片描述
    再规范命名:docker tag webserver:v4 leehoo0/nginx:latest
    最后上传:docker push leehoo0/nginx:latest
    请添加图片描述
    请添加图片描述

删除时在web界面删除即可:
请添加图片描述

2. Registry工作原理

2.1 简单搭建一个私有仓库

docker hub(官方仓库)的限制:

  • 需要网络连接,不加速时,下载较慢
  • 所有人都可访问
  • 由于安全原因企业并不能将镜像放在网络中
    所以,利用docker官方开源的registry(私有仓库),可以快速构建私有仓库
    个人搭建时,直接下载即可:
    请添加图片描述
    但是此仓库缺少web ui;
    首先查看该仓库的搭建过程,了解暴露端口以及数据卷挂载信息:
    请添加图片描述
    运行docker,指定名字,并作端口映射,手动在虚拟机上挂载私人仓库的数据卷目录:docker run -d --name registry -p 5000:5000 -v /opt/registry:/var/lib/registry registry
    启动完成后,可在虚拟机上netstat -antlp查看端口监听状态:
    请添加图片描述
    此时tree /opt/registry/查看该仓库结构,显示为空:
    请添加图片描述
    在对私有仓库上传镜像前,需要先对镜像名称规范处理,,需要在重命名的镜像名称前加上本地端口,并用”/“隔开:docker tag webserver:v4 localhost:5000/webserver:latest
    再按规范格式上传:docker push localhost:5000/webserver
    总结来说,镜像斜杠(/)前为公有仓库登陆用户名称或者为localhost:本地端口
    上传成功:
    请添加图片描述
    此时,挂载的本地数据卷下有数据结构:
    请添加图片描述
    此时,可以用curl localhost:5000/v2/_catalog查看本地仓库中存放的镜像数:
    请添加图片描述

2.2 原理

一次docker pull/push背后的进程:docker服务器分为docker index和registry。server端发出pull/push指令后,首先会由index端进行认证,获取请求镜像的在registry地址和token并回放给server端,server端由地址和token向registry请求下载镜像,下载时registry会在index上用token校验server的合法性再发送给server端。即,不同的镜像存于不同的registry服务端上,但是均由index进行索引。

Docker Registry有三个角色,分别是index,registry和registry client

  • Index负责并维护有关用户账户,镜像的校验信息以及共命名空间的信息(Web ui,元数据储存,认证服务,符号化)
  • Registry时镜像和图表的仓库,它不具有本地数据库以及不提供用户认证,通过Index Auth service和Token的方式进行认证。
  • Registry Client中,docker充当registry客户端来维护推送和拉取,以及客户端的授权

2.3 基于网络的私有仓库

在server1上已做了一个私有仓库,此时可以通过ip进行访问,若是在严格封闭安全的局域网环境下,可以实现免认证加密进行镜像下载。但是在网络中时很不安全,所以只推荐在隔离环境中座测试。

1。实现隔离环境下的基于https的私有仓库
新建一个虚拟机server2,并安装docker-ce,步骤参照上一节内容
在sever2上无法直接拉取serveer1上的私有仓库,因为docker走https加密协议,
解决依据:官方registry文档,在json文件中指明不安全的网络仓库ip
vim /etc/docker/daemon.json

{
  "insecure-registries" : ["myregistrydomain.com:5000"]
}

systemctl daemon-reload
systemctl reload docker
此时可以成功拉取:docker pull 172.25.38.1:5000/webserver
请添加图片描述
简单运行测试:
请添加图片描述
2。实现仓库加密

**a.**设置签名
mkdir -p certs
openssl req -newkey rsa:4096 -nodes -sha256 -keyout certs/leeupup.com.key -x509 -days 365 -out certs/leeupup.com.crt
请添加图片描述
在server1上设置解析:
请添加图片描述

**b.**启用仓库
在server1上:
首先删除之前的私有仓库:docker rm -f registry
执行运行docker命令,-e为执行命令,可多次执行;挂载签名目录,设置docker寻找crt和key的环境变量:docker run -d --name registry -p 443:443 -v /opt/registry:/var/lib/registry -v /root/certs:/certs -e REGISTRY_HTTP_ADDR=0.0.0.0:443 -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/leeupup.com.crt -e REGISTRY_HTTP_TLS_KEY=/certs/leeupup.com.key registry
在serber1上由于无web界面,可以用curl -k https://172.25.38.1/v2/_catalog查看效果
请添加图片描述
此时若在仓库中上传镜像:

docker tag busybox:latest reg.leeupup.com/busybox:latest
docker push reg.leeupup.com/busybox:latest

会提示:
请添加图片描述
需要首先在指定目录创建文件夹:mkdir /etc/docker/certs.d/reg.leeupup.com/ -p
再将创建的证书拷贝至该文件夹中:cp certs/leeupup.com.crt /etc/docker/certs.d/reg.leeupup.com/
此时即可push成功:
请添加图片描述

在server2上:
此时已不需要daemon文件,先删除
server2上同样需要创建同样的文件夹并拷贝证书:mkdir /etc/docker/certs.d/reg.leeupup.com/ -p
在server1上:scp leeupup.com.crt @server2:/etc/docker/certs.d/reg.leeupup.com
并且在server2上解析仓库域名:172.25.38.1 server1 reg.leeupup.com
此时,在server上拉取成功:docker pull reg.leeupup.com/busybox
请添加图片描述
上传同理

3。仓库认证
首先停止仓库:docker rm -f registry
新建目录:mkdir auth
安装认证工具,httpd-tools将生成并保管docker私有仓库的用户及密码:yum install httpd-tools -y
添加两个htpasswd用户:

htpasswd -B -c auth/htpasswd lee
htpasswd -B auth/htpasswd admin

请添加图片描述
结下来,在之前的基础上,进一步完善私有仓库的启动,增加挂载认证用户文件以及相应的执行操作:

docker run -d --name registry -p 443:443 -v /opt/registry:/var/lib/registry [root@server1 ~]# docker run -d --name registry -p 443:443 -v /opt/registry:/var/lib/registry -v /root/certs:/certs -e REGISTRY_HTTP_ADDR=0.0.0.0:443 -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/leeupup.com.crt -e REGISTRY_HTTP_TLS_KEY=/certs/leeupup.com.key -v /root/auth:/auth -e "REGISTRY_AUTH=htpasswd" -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd registry

在server1上进行认证登陆:docker login reg.leeupup.com
请添加图片描述
若登陆成功,则会在/root/.docker/config.ison下生成一个认证文件:
请添加图片描述
后续不需要在登陆
此时可以上传:docker push reg.leeupup.com/ubuntu:latest
请添加图片描述
在server2上进行下载,直接下载会报错,登陆i认证后即可成功下载:
请添加图片描述
在此docker能知道该私有仓库网址,是由于在每个服务器上均做了解析

到此,完成了私有仓库最基本的认证以及加密功能,但是没有企业级仓库的图形化操作,上传镜像时没有合法性校验,没有基于角色的访问性控制,没有镜像的漏洞扫描,以及签名等,所以,接下来介绍企业级的harbor仓库。

3. harbor仓库

3.1 harbor安装与配置

首先删除上节的仓库容器并清空认证信息
在github上下载,但是由于速度较慢,所以本次使用的已下载好离线包
解压离线包:tar zxf harbor-offline-installer-v1.10.1.tgz
请添加图片描述
此外,还需要docker-compose程序,目的是同时管理多个容器,也可在github上下载,此处仍用本地包,将该二进制程序移动到可执行目录下:mv docker-compose-Linux-x86_64-1.27.0 /usr/local/bin/docker-compose
给予执行权限:chmod +x /usr/local/bin/docker-compose
在harbor主文件夹下:
启动harbor仓库:./install.sh
停止harbor镜像仓库:docker-compose down

进入harbor主配置文件,设置仓库名,分开放置证书和数据卷挂载点,并设立web界面管理员密码:vim /root/harbor/harbor.yml

hostname: reg.leeupupu.com

  certificate: /certs/leeupup.com.crt
  private_key: /certs/leeupup.com.key

harbor_admin_password: lee

可在harbor文件夹内直接运行比较基础的harbor仓库:./install.sh

请添加图片描述
此时docker ps会发现已经启动了很多容器,
请添加图片描述
此时可以用docker-compose ps控制已启动容器:
请添加图片描述
此时浏览器访问172.25.38.1
请添加图片描述
即可看到web ui界面下的harbor仓库:
请添加图片描述
虚拟机登陆harbor仓库:docker login reg.leeupup.com
请添加图片描述

3.2 向harbor上传镜像

需先规范命名,在地址前加仓库名称:docker tag busybox:latest reg.leeupup.com/library/busybox:latest
再进行上传:docker push reg.leeupup.com/library/busybox
此时在web界面即可看到:
请添加图片描述

由于设置,所有上传至harbor仓库的镜像,都保存在数据卷挂载对应的目录,也就是server1的/data目录下

3.3 私有仓库代替共有仓库下载

调整顺寻,使每次docker在拉取镜像时,先在私有仓库中寻找,若无再从公有仓库下载
在servber2上vim /etc/docker/daemon.json

{
  "registry-mirrors": ["https://reg.leeupup.com"]
}

systemctl reload docker
此时,再对镜像尝试拉取:
请添加图片描述
可以在web界面看到一个匿名用户的下载记录:
请添加图片描述

3.4 新建不公开项目

新建私有项目(下载前需要先docker login)
请添加图片描述
可添加login成员及设置权限(此步骤需要提前添加harbor用户,再设置可访问该仓库的成员):
请添加图片描述
其中访客不能上传
私有仓库在拉取时,若是不公开仓库,需要在ip地址后和镜像名称中间添加仓库名称

3.5 增加镜像扫描和漏洞扫描功能

请添加图片描述
若要从新准备harbor仓库,清除以前的配置,在主目录下执行./prepare
请添加图片描述
./install.sh --with-notary --with-clair --with-chartmuseum
请添加图片描述
重新改配置仓库镜像还在,因为并没有删除/data文件,多出一个Helm Charts,用于k8s中智能包管理
请添加图片描述
请添加图片描述
开启其中的自动扫描功能,上传镜像即可自动扫描:
请添加图片描述

请添加图片描述
但是扫描会比较消耗资源,使得虚拟机快照快速变大

3.6 内容信任和镜像签名

目的是在上传时确认镜像的安全性,对镜像签名后才允许上传
首先部署证书,之前已做:

/etc/docker/certs.d/leeupup.com/ca.crt
~/.docker/tls/leeupup.com:4443/ca.crt

启动内容信任并告知服务器位置:
设置DOCKER_CONTENT_TRUST=1是对docker应用参数进行控制,使其对上传的镜像签名

export DOCKER_CONTENT_TRUST=1
export DOCKER_CONTENT_TRUST_SERVER=https://reg.leeupup.com:4443

此时,上传的镜像会进行签名认证,其他服务器可下载

本节试验完成后,需要将在harbor文件夹内利用docker-compose down将harbor仓库暂时停止,并用./prepare重置harbor仓库的所有设置
再次启动harbor仓库时,需要将--with-chair参数去掉,否则不断扫描会时得虚拟机占据空间快速变大,即执行./install.sh --with-chartmuseum
此时,web界面中的扫描和内容信任选项将关闭

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值