镜像仓库(image Registry)类似代码仓库,是集中存放镜像文件的场所,负责镜像内容的存储与分发,pull/push镜像都将直接与registry进行交互。
有资料会将仓库(Repository) 和注册服务器(Registry)混为一谈,并不严格区分。实际上,注册服务器是存放仓库的地方,其上往往存放着多个仓库。每个仓库集中存放某一类镜像,往往包括多个镜像文件,通过不同的标签(tag)来进行区分。
例如存放Ubuntu操作系统镜像的仓库,称为Ubuntu仓库,其中可能包括14.04、12.04等不同版本的镜像。
对于仓库地址来说,dl.dockerpool.com/ubuntu,前半个是注册服务地址,后半个是仓库名。
根据存储的镜像公开分享与否,镜像仓库分为公开仓库(Public)和私有仓库(Private)两种形式。
目前,最大的公开仓库是Docker Hub,存放了数量庞大的镜像供用户下载。
如果用户不希望公开分享自己的镜像文件,也可以在本地网络创建一个只能自己访问的私有仓库。
docker默认用https和仓库交互,如果仓库是http的,要配:
"insecure-registries": ["k8s.com:5000","reg.harbor.com"]
Docker官方提供了Docker registry,使用go语言实现。
目前最常用的镜像仓库是Harbor,它是Vmware公司开源的企业级Docker Registry管理项目,基于Docker Registry V2版本
Harbor的所有组件都在Docker中部署,所以Harbor可使用Docker Compose快速启停。
下面采用的是harbor-offline-installer的tgz包的部署方式
修改harbor.yml
hostname: reg.harbor.com
http:
# port for http, default is 80. If https enabled, this port will redirect to https port
port: 80
https:
# https port for harbor, default is 443
port: 443
# The path of cert and key files for nginx
certificate: /data/harbor/cert/ca.crt
private_key: /data/harbor/cert/ca.key
database:
# The password for the root user of Harbor DB
password: root@ailk2019
data_volume: /data/harbor/data
执行install.sh,Harbor服务就会根据当前目录下的docker-compose.yml开始下载依赖的镜像,检测并通过docker-compose启动各服务。各服务以容器的形式存在:
以后执行docker-compose start/stop或者docker-compose up/down -d就可以快速开关服务。
首先生成CA公钥ca.crt和私钥ca.key
openssl genrsa -out ca.key 4096 openssl req -x509 -new -nodes -sha512 -days 3650 -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=reg.harbor.com" -key ca.key -out ca.crt
生成域名reg.harbor.com的私钥和证书请求文件(-subj参数表示组织名,其中CN必须包含域名)
openssl genrsa -out reg.harbor.com.key 4096 openssl req -sha512 -new -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=reg.harbor.com" -key reg.harbor.com.key -out reg.harbor.com.csr
生成 x509 v3 extension file
cat > v3.ext <<-EOF authorityKeyIdentifier=keyid,issuer basicConstraints=CA:FALSE keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment extendedKeyUsage = serverAuth subjectAltName = @alt_names [alt_names] DNS.1=reg.harbor.com DNS.2=reg.harbor DNS.3=hostname EOF
使用v3.ext文件生成证书
openssl x509 -req -sha512 -days 3650 -extfile v3.ext -CA ca.crt -CAkey ca.key -CAcreateserial -in reg.harbor.com.csr -out reg.harbor.com.crt
由于Docker程序将crt files看作CA certificates、cert files看作client certificates,所以需要将crt文件转换为cert文件。
openssl x509 -inform PEM -in reg.harbor.com.crt -out reg.harbor.com.cert cp reg.harbor.com.cert /etc/docker/certs.d/reg.harbor.com/ cp reg.harbor.com.key /etc/docker/certs.d/reg.harbor.com/ cp ca.crt /etc/docker/certs.d/reg.harbor.com/
/etc/docker/certs.d文件下的目录结构如下:
/etc/docker/certs.d/ └── reg.harbor.com ├── reg.harbor.com.cert <-- Server certificate signed by CA ├── reg.harbor.com.key <-- Server key signed by CA └── ca.crt <-- Certificate authority that signed the registry certificate
ca.crt文件必须复制到每台docker主机的/etc/docker/certs.d/reg.harbor.com/下
一般还要在操作系统层面信任此CA
cp certs/domain.crt /etc/pki/ca-trust/source/anchors/myregistrydomain.com.crt update-ca-trust
主要功能:
(1)Docker Registry管理UI
部分配置项可以在UI页面上直接修改,如邮件服务器配置、LDMA配置等
(2)角色访问控制
除了admin,用户分为三种角色:项目管理员(MDRWS)、开发人员(RWS)和访客(RS)
M:管理、D:删除、R:读取、W:写入、S:查询
用户只能新建自己的项目,并push/pull自己所在项目的镜像,其他人的私有仓库都不能操作。
用户创建私有项目project_name后,只有该用户允许的用户才向该项目中上传镜像:
(3)复制备份
新建复制目标-新建复制规则,就可以通过docker registry的API去拷贝
(4)集成了clair镜像扫描功能
它是cereos开发的一款漏洞扫描工具,可以检查镜像操作系统以及上面安装包是否与已知不安全的包版本相匹配,从而提高镜像安全性。
执行./install.sh进行安装时指定-with-clair选项即可
(5)日志管理
(6)AD/LDAP集成
默认认证模式把用户凭证存储在本地数据库。
配置LDAP完成后,即可使用ldap帐户登录harbor,但是项目权限无法通过ldap组去控制。
通过ldap组控制harbor权限,需满足以下条件:支持导入ldap组、支持memberOf属性
(7)OIDC支持
可以启用单点登录