目录
一、Docker registry 仓库
Docker 仓库是用来包含镜像的位置,Docker提供一个注册服务器 (Register)来保存多个仓库,每个仓库又可以包含多个具备不同 tag的镜像。 Docker运行中使用的默认仓库是 Docker Hub 公共仓库。
1、docker hub是docker公司维护的公共仓库,用户可以免费使用,也可以购买私有仓库。有时候使用 Docker Hub 这样的公共仓库可能不方便,例如:需要internet连接、速度慢 ,所有人都可以访问,由于安全原因企业不允许将镜像放到外网。
2、docker公司已经将registry开源,我们可以快速构建企业私有仓库,用户可以创建一个本地仓库供私人使用。docker-registry 是官方提供的工具,可以用于构建私有的镜像仓库。
1.Registry工作原理
一次docker pull 或 push背后的关联:index服务主要提供镜像索引以及用户认证的功能。当下载一个镜像的时候,首先会去index服务上做认证,然后查找镜像所在的registry的地址并放回给 docker客户端,docker客户端再从registry下载镜像,在下载过程中 registry会去index校验客户端token的合法性,不同镜像可以保存在不同的registry服务上, 其索引信息都放在index服务上。
Docker Registry有三个角色,分别是index、registry和registry client。
1、index : 负责并维护有关用户帐户、镜像的校验以及公共命名空间的信息。 Web UI 、元数据存储 、认证服务 、符号化;
2、registry :是镜像和图表的仓库,它不具有本地数据库以及不提供用户认证,通过 Index Auth service的Token的方式进行认证。
3、Registry Client :Docker充当registry客户端来维护推送和拉取,以及客户端的授权。
2.本地仓库搭建
把之前实验生成的镜像rhel7:v4保存为本地包;
docker image prune :用以清理不再使用的docker镜像
导入镜像
镜像改名:标记原有镜像rhel7:v4 为新镜像demo:latest,并删除rhel7:v4不影响demo的使用
将真机的registry2.tar传给server1
导入镜像, 将registry:2镜像打标签为registry:latest
查看逻辑卷,并清除
创建一个新的容器,-v表示将本地 /opt/registry挂载到容器中的/var/lib/registry目录, -p:端口映射,主机(宿主)5000端口:容器5000端口;
查看端口5000打开
查看本地映射的仓库路径
将容器中的game2048镜像标记到本地仓库中,本地镜像在命名时需要加上仓库的ip和端口;
上传镜像到本地仓库,上传成功后本地路径中也产生了文件
删除容器之后,重新创建,之前的内容依然存在
测试可以成功访问
3.本地私有仓库加密认证
首先创建加密认证的密钥,并创建一个目录certs用来保存密钥;
为Docker仓库添加证书加密功能,生成自签名证书(域名reg.westos.org要求在主机上有解析),证书文件westos.org.crt,采用自动生成秘钥的方式,指定生成秘钥长度为4096,秘钥文件westos.org.key.
openssl req命令主要的功能有,生成证书请求文件, 查看验证证书请求文件,还有就是生成自签名证书。
主要命令选项:
-new :说明生成证书请求文件
-x509 :说明生成自签名证书
-key :指定已有的秘钥文件生成秘钥请求,只与生成证书请求选项-new配合。
-newkey :-newkey是与-key互斥的,-newkey是指在生成证书请求或者自签名证书的时候自动生成密钥,
-out :-out 指定生成的证书请求或者自签名证书名称
-nodes :如果指定-newkey自动生成秘钥,那么-nodes选项说明生成的秘钥不需要加密
成功生成
重建registry容器
在/etc/hosts添加域名解析;
标记nginx镜像归类到本地reg.westos.org仓库中,然后上传镜像到私有仓库,此时会报错,
由于证书是被不知名的ca签名的(自签名的证书),因此取不到认证
由于我们使用的是自签名证书,客户端要与私有仓库通信,必须在/etc/docker/下建立目录:certs.d/reg.westos.org(域名目录),然后把私有仓库的证书拷贝到这个目录
上传镜像成功;
测试查看上传的内容:curl是用在命令行和脚本进行传输数据到服务器或者从服务器传输数据的工具,-k:允许curl使用非安全的ssl连接并且传输数据(证书不受信)
为Docker仓库添加用户认证功能,创建认证目录,安装认证的软件(此工具可以生成访问密码)
为admin用户和lr用户添加认证信息和密码(第一次加参数c,之后不加,否则会覆盖原来)
删除之前的容器并重建,添加用户认证及密钥模块;
查看日志
测试在server1上传镜像,仓库认证后,上传和下载前都需要登陆,如果不登陆,会报错,
登录之后,再次上传镜像,成功
此路径下 /root/.docker/config.json可以查看认证
退出登陆后,就查看不到认证信息了
将server1的docker软件仓库配置文件传给server2,用于测试能否拉取镜像;
server2安装docker
使得服务开机自启
在server2上添加本地解析
将server1前面生成的证书发送给server2,不然拉取镜像就会报错
server2登陆后拉取成功
二、Docker harbor 仓库
Harbor简介
1、虽然Docker官方提供了公共的镜像仓库,但是从安全和效率等方面考虑,部署我们私有环境内的Registry也是非常必要的。
2、Harbor是由VMware公司开源的企业级的Docker Registry管理项目,相比docker官方拥有更丰富的权限权利和完善的架构设计,适用大规模docker集群部署提供仓库服务。
3、它主要提供 Docker Registry 管理界面UI,可基于角色访问控制,镜像复制, AD/LDAP 集成,日志审核等功能,完全的支持中文
先将之前的仓库删除掉(不然会冲突)
harbor仓库提供在线和离线两种安装工具,这里使用离线安装(要求先安装好docker),另外还需要docker-compose-Linux(用来管理多个容器,形成一个完整独立的服务)和harbor-offline-installer
1.harbor安装配置
真机将Harbor安装包发送给server1
解压
编辑harbor.yaml配置文件
拷贝证书目录到/data目录下
安装baobor时报错,因为还需要docker-compose
将docker-compose二进制文件发送给server1
因为docker-compose安装包是二进制文件,所以放到/usr/local/bin下,赋予执行权限
再次安装harbor
安装成功
开启docker-compose
查看开启状态
查看日志
在真机/etc/hosts加上该主机域名解析
在浏览器输入reg.westos.org访问,由于是自签名证书,没有经过可信第三方,所以会显示不安全的连接,此时手动信任即可,点击advanced;
输入账户admin和设定的密码westos(配置文件中设置的),登录成功
server1登陆reg.westos.org
修改nginx镜像标签到reg.westos.org下
上传镜像
到网页上查看上传成功
2.添加默认仓库路径
在远端拉取镜像时,可以直接指定我们的私有仓库进行下载;
docker安装后默认没有daemon.json这个配置文件,需要进行手动创建,写入 registry 私有仓库地址
server1将daemon.json传给server2
重新加载服务后,可以查看到新添加的拉取镜像的仓库路径
测试拉取ngnix
网页查看下载和上传日志
删掉刚才拉取的nginx镜像
直接运行容器时,第一步是pull拉取镜像,说明会自动拉取没有的镜像
3.漏洞扫描
接下来,对项目进行管理,添加新的项目westos(私有)
添加用户
添加用户到项目成员
上传镜像到westos项目中
上传成功
server2中测试拉取(用刚刚添加到westos项目的成员登录)
web界面查看日志
docker logout reg.westos.org :登出
docker-compose down:关闭并清理配置信息;
./prepare :清理缓存
./install.sh --with-notary --with-clair --with-chartmuseum:安装时添加漏洞扫描,镜像信任等功能;
–with-notary: 镜像信任,Notary是Docker镜像的签名工具,用来保证镜像在pull,push和传输过程中的一致性和完整性,避免中间人攻击,避免非法的镜像更新和运行。镜像信任功能能够保证镜像的安全,只有打了信任标签的镜像才能被拉取;
–with-clair: 镜像安全扫描,Harbor与Clair集成,添加漏洞扫描功能。 默认在运行harbor时漏洞扫描是没有开启的,需要重新开启并添加参数;
–with-chartmuseum: 支持chart仓库服务
可以看到漏洞扫描功能已添加
查看nginx镜像,显示未扫描
手动扫描
扫描结束,显示没有漏洞
也可以使用自动扫描,之后新添加的镜像就可以自动扫描
可以看到上传的镜像已经被扫描
4.内容信任
在web中开启内容
启用docker内容信任
测试上传镜像,显示报错,因为要部署根证书
切到隐藏文件夹下,创建根证书目录
再次进行镜像上传,需要输入根密码和仓库密码
可以看到签名成功并上传
当只更改镜像的名字后,重新上传镜像v1;
此时只需要更改仓库的key
签名成功并上传
打开项目westos的内容信任之后
server2上拉取未授权的镜像会报错
关闭信任之后
成功拉取到westos项目的镜像
也可以让server1向私有仓库中重新上传该镜像,并签名,此时server2也可以拉取该镜像了
在server1上:修改:export DOCKER_CONTENT_TRUST=0(关闭内容信任功能),那么在上传镜像的时候就不需要再输入认证了
最后进行优化容器,扫描会使得占用的空间越来越大,所以重新修改一下选项
安装时去掉内容信任和镜像扫描功能