文章目录

  • 1. docker仓库概念
  • 2. Registry工作原理
  • 2.1 简单搭建一个私有仓库
  • 2.2 原理
  • 2.3 基于网络的私有仓库
  • 3. harbor仓库
  • 3.1 harbor安装与配置
  • 3.2 向harbor上传镜像
  • 3.3 私有仓库代替共有仓库下载
  • 3.4 新建不公开项目
  • 3.5 增加镜像扫描和漏洞扫描功能
  • 3.6 内容信任和镜像签名


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界面删除即可:

rancher docker安装初始密码 docker rrshare_docker

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-reloadsystemctl reload docker

此时可以成功拉取:docker pull 172.25.38.1:5000/webserver

rancher docker安装初始密码 docker rrshare_上传_02


简单运行测试:

rancher docker安装初始密码 docker rrshare_私有仓库_03


2。实现仓库加密**a.**设置签名

mkdir -p certsopenssl req -newkey rsa:4096 -nodes -sha256 -keyout certs/leeupup.com.key -x509 -days 365 -out certs/leeupup.com.crt

rancher docker安装初始密码 docker rrshare_私有仓库_04


在server1上设置解析:

rancher docker安装初始密码 docker rrshare_私有仓库_05

**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查看效果

rancher docker安装初始密码 docker rrshare_私有仓库_06


此时若在仓库中上传镜像:

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

会提示:

rancher docker安装初始密码 docker rrshare_docker_07


需要首先在指定目录创建文件夹:mkdir /etc/docker/certs.d/reg.leeupup.com/ -p 再将创建的证书拷贝至该文件夹中:cp certs/leeupup.com.crt /etc/docker/certs.d/reg.leeupup.com/

此时即可push成功:

rancher docker安装初始密码 docker rrshare_上传_08

在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

rancher docker安装初始密码 docker rrshare_私有仓库_09


上传同理

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

rancher docker安装初始密码 docker rrshare_私有仓库_10


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

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

rancher docker安装初始密码 docker rrshare_上传_11


若登陆成功,则会在/root/.docker/config.ison下生成一个认证文件:

rancher docker安装初始密码 docker rrshare_docker_12


后续不需要在登陆

此时可以上传:docker push reg.leeupup.com/ubuntu:latest

rancher docker安装初始密码 docker rrshare_上传_13


在server2上进行下载,直接下载会报错,登陆i认证后即可成功下载:

rancher docker安装初始密码 docker rrshare_上传_14


在此docker能知道该私有仓库网址,是由于在每个服务器上均做了解析

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

3. harbor仓库

3.1 harbor安装与配置

首先删除上节的仓库容器并清空认证信息

在github上下载,但是由于速度较慢,所以本次使用的已下载好离线包

解压离线包:tar zxf harbor-offline-installer-v1.10.1.tgz

rancher docker安装初始密码 docker rrshare_上传_15


此外,还需要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

rancher docker安装初始密码 docker rrshare_docker_16


此时docker ps会发现已经启动了很多容器,

rancher docker安装初始密码 docker rrshare_私有仓库_17


此时可以用docker-compose ps控制已启动容器:

rancher docker安装初始密码 docker rrshare_上传_18


此时浏览器访问172.25.38.1

rancher docker安装初始密码 docker rrshare_私有仓库_19


即可看到web ui界面下的harbor仓库:

rancher docker安装初始密码 docker rrshare_docker_20


虚拟机登陆harbor仓库:docker login reg.leeupup.com

rancher docker安装初始密码 docker rrshare_上传_21

3.2 向harbor上传镜像

需先规范命名,在地址前加仓库名称:docker tag busybox:latest reg.leeupup.com/library/busybox:latest 再进行上传:docker push reg.leeupup.com/library/busybox

此时在web界面即可看到:

rancher docker安装初始密码 docker rrshare_上传_22

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

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

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

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

systemctl reload docker 此时,再对镜像尝试拉取:

rancher docker安装初始密码 docker rrshare_上传_23


可以在web界面看到一个匿名用户的下载记录:

rancher docker安装初始密码 docker rrshare_docker_24

3.4 新建不公开项目

新建私有项目(下载前需要先docker login)

rancher docker安装初始密码 docker rrshare_私有仓库_25


可添加login成员及设置权限(此步骤需要提前添加harbor用户,再设置可访问该仓库的成员):

rancher docker安装初始密码 docker rrshare_私有仓库_26


其中访客不能上传

私有仓库在拉取时,若是不公开仓库,需要在ip地址后和镜像名称中间添加仓库名称

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

rancher docker安装初始密码 docker rrshare_docker_27


若要从新准备harbor仓库,清除以前的配置,在主目录下执行./prepare

rancher docker安装初始密码 docker rrshare_私有仓库_28


./install.sh --with-notary --with-clair --with-chartmuseum

rancher docker安装初始密码 docker rrshare_私有仓库_29


重新改配置仓库镜像还在,因为并没有删除/data文件,多出一个Helm Charts,用于k8s中智能包管理

rancher docker安装初始密码 docker rrshare_私有仓库_30


rancher docker安装初始密码 docker rrshare_私有仓库_31


开启其中的自动扫描功能,上传镜像即可自动扫描:

rancher docker安装初始密码 docker rrshare_docker_32

rancher docker安装初始密码 docker rrshare_上传_33


但是扫描会比较消耗资源,使得虚拟机快照快速变大

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界面中的扫描和内容信任选项将关闭