文章目录
- 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界面删除即可:
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文件中指明不安全的网络仓库ipvim /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界面中的扫描和内容信任选项将关闭