学习欲无止境,加油吧年轻人
1.Harbor,是一个英文单词,意思是港湾,港湾是干什么的呢,就是停放货物的,而货物呢,是装在集装箱中的,说到集装箱,就不得不提到Docker容器,因为docker容器的技术正是借鉴了集装箱的原理。所以,Harbor正是一个用于存储Docker镜像的企业级Registry服务。
Docker容器应用的开发和运行离不开可靠的镜像管理,虽然Docker官方也提供了公共的镜像仓库,但是从安全和效率等方面考虑,部署我们私有环境内的Registry也是非常必要的。Harbor是由VMware公司开源的企业级的Docker Registry管理项目,它包括权限管理(RBAC)、LDAP、日志审核、管理界面、自我注册、镜像复制和中文支持等功能。
2.Harbor特性
基于角色的访问控制:用户与Docker镜像仓库通过“项目”进行组织管理,一个用户可以对多个镜像仓库在同一命名空间(project)里有不同的权限。
镜像复制: 镜像可以在多个Registry实例中复制(同步)。尤其适合于负载均衡,高可用,混合云和多云的场景。
图形化用户界面: 用户可以通过浏览器来浏览,检索当前Docker镜像仓库,管理项目和命名空间。
AD/LDAP 支持: Harbor可以集成企业内部已有的AD/LDAP,用于鉴权认证管理。
审计管理: 所有针对镜像仓库的操作都可以被记录追溯,用于审计管理。
国际化: 已拥有英文、中文、德文、日文和俄文的本地化版本。更多的语言将会添加进来。
RESTful API : RESTful API 提供给管理员对于Harbor更多的操控, 使得与其它管理软件集成变得更容易。
部署简单: 提供在线和离线两种安装工具, 也可以安装到vSphere平台(OVA方式)虚拟设备。
3.Harbor组件
Harbor在架构上主要由6个组件构成:
Proxy:Harbor的registry, UI, token等服务,通过一个前置的反向代理统一接收浏览器、Docker客户端的请求,并将请求转发给后端不同的服务。
Registry: 负责储存Docker镜像,并处理docker push/pull 命令。由于我们要对用户进行访问控制,即不同用户对Docker image有不同的读写权限,Registry会指向一个token服务,强制用户的每次docker pull/push请求都要携带一个合法的token, Registry会通过公钥对token 进行解密验证。
Core services: 这是Harbor的核心功能,主要提供以下服务:
UI:提供图形化界面,帮助用户管理registry上的镜像(image), 并对用户进行授权。
webhook:为了及时获取registry 上image状态变化的情况, 在Registry上配置webhook,把状态变化传递给UI模块。
token 服务:负责根据用户权限给每个docker push/pull命令签发token. Docker 客户端向Regiøstry服务发起的请求,如果不包含token,会被重定向到这里,获得token后再重新向Registry进行请求。
Database:为core services提供数据库服务,负责储存用户权限、审计日志、Docker image分组信息等数据。
Job Services:提供镜像远程复制功能,可以把本地镜像同步到其他Harbor实例中。
Log collector:为了帮助监控Harbor运行,负责收集其他组件的log,供日后进行分析
本次示例是在Centos中安装
安装docker
yum -y remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
yum install -y yum-utils &>/dev/null
#(默认是国外的!在你安装Docker引擎时特别特别慢)
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
# 推荐使用阿里国内源安装docker
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
# 更新软件包索引
yum makecache fast
yum -y install docker-ce docker-ce-cli containerd.io
systemctl stop docker && systemctl daemon-reload && systemctl enable docker && systemctl start docker
使用docker version查看版本
[root@localhost harbor]# docker version
Client: Docker Engine - Community
Version: 20.10.14
API version: 1.41
Go version: go1.16.15
Git commit: a224086
Built: Thu Mar 24 01:49:57 2022
OS/Arch: linux/amd64
Context: default
Experimental: true
Server: Docker Engine - Community
Engine:
Version: 20.10.14
API version: 1.41 (minimum version 1.12)
Go version: go1.16.15
Git commit: 87a90dc
Built: Thu Mar 24 01:48:24 2022
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.5.11
GitCommit: 3df54a852345ae127d1fa3092b95168e4a88e2f8
runc:
Version: 1.0.3
GitCommit: v1.0.3-0-gf46b6ba
docker-init:
Version: 0.19.0
GitCommit: de40ad0
安装Docker Compose
Compose是一个用于定义和运行多容器Docker应用程序的工具。通过编写,您可以使用YAML文件配置应用程序的服务。然后,使用一个命令就可以从yml文件配置中创建并启动配置中的所有服务。
Compose在所有环境中编写工作:生产、分期、开发、测试以及CI工作流。
使用Compose基本上是一个三步的过程:
Dockerfile
定义应用程序的环境,这样它就可以在任何地方复制。docker-compose.yml
中定义构成应用程序的服务。这样它们就可以在一个孤立的环境中一起运行。docker-compose up
然后编写、启动和运行整个应用程序。作用:批量容器服务编排。
官网安装地址
# 1、下载DockerCompose当前的稳定版本
sudo curl -L "https://github.com/docker/compose/releases/download/1.28.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose #国外比较慢
curl -L https://get.daocloud.io/docker/compose/releases/download/1.24.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose #国内比较快
# 2、授权
chmod +x /usr/local/bin/docker-compose
注*如果命令docker-compose安装后失败,请检查您的路径。您还可以创建一个指向/usr/bin或者路径中的任何其他目录。
例如:
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
# 3、测试安装
docker-compose --version
编写Harbor的Https认证
【1】编写认证shell,auth.sh
SSL证书创建
选项参数说明:
genrsa 生成私钥
-out filename 标准输出到filename文件
req 生成证书请求
-new 生成新证书签署请求
-x509 专用于CA生成自签证书;不自签的时候不要加该选项
-days num 证书的有效期限
-key file 生成请求时用到的私钥文件
-out filename 标准输出到filename文件
subj内容详解:
C = 国家
ST = 省/州
L = 城市
O = Organization Name
OU = Organizational Unit Name
CN = Common Name
emailAddress = [email protected]
#!/bin/bash
mkdir -p /data/cert
cd /data/cert
# 创建根证书
openssl genrsa -out /data/cert/ca.key 4096 # 创建CA私钥
openssl req -x509 -new -nodes -sha512 -days 3650 -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=121.37.255.40" -key ca.key -out ca.crt # 制作CA公钥
openssl genrsa -out /data/cert/$1.key 4096
openssl req -sha512 -new -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=$1" -key /data/cert/$1.key -out /data/cert/$1.csr
# 生成一个x509 v3扩展文件
cat > v3.ext <<-EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = IP:$1
EOF
# 证书签发(使用CA证书进行签发)
openssl x509 -req -sha512 -days 3650 -extfile /data/cert/v3.ext -CA /data/cert/ca.crt -CAkey /data/cert/ca.key -CAcreateserial -in /data/cert/$1.csr -out /data/cert/$1.crt
# 转换 /data/cert/$1.crt 为 /data/cert/$1.cert
openssl x509 -inform PEM -in /data/cert/$1.crt -out /data/cert/$1.cert
# 将服务器证书,密钥和 CA 文件复制到 Harbor主机上的 Docker 证书文件夹中
mkdir -p /etc/docker/certs.d/$1/
cp /data/cert/$1.cert /etc/docker/certs.d/$1/
cp /data/cert/$1.key /etc/docker/certs.d/$1/
cp /data/cert/$1.crt /etc/pki/ca-trust/source/anchors/
# 更新系统的证书
update-ca-trust
【2】运行auth.sh
chmod +x auth.sh #添加执行权限
./auth.sh 192.168.235.10 #(192.168.235.10 表示安装harbor的地址,是传递给auth.sh的参数)
【3】修改daemon.json
添加一行insecure-registries配置即可,允许使用安全方式访问Harbor镜像仓库
#192.168.235.10表示harbor仓库的地址
[root@localhost harbor]# cat /etc/docker/daemon.json
{
"registry-mirrors": ["https://cy1sz59q.mirror.aliyuncs.com"],
"insecure-registries":["192.168.235.10"]
}
安装Harbor
wget https://github.com/goharbor/harbor/releases/download/v2.4.2/harbor-online-installer-v2.4.2.tgz
【1】解压
[root@localhost ~]# tar -zxvf harbor-online-installer-v2.4.2.tgz
[root@localhost ~]# cd harbor
[root@localhost harbor]# ll
总用量 56
drwxr-xr-x. 3 root root 20 4月 6 18:34 common
-rw-r--r--. 1 root root 3361 3月 15 11:51 common.sh
-rw-r--r--. 1 root root 5889 4月 6 21:52 docker-compose.yml
-rw-r--r--. 1 root root 9680 4月 6 21:48 harbor.yml
-rw-r--r--. 1 root root 9668 3月 15 11:51 harbor.yml.tmpl
-rwxr-xr-x. 1 root root 2500 3月 15 11:51 install.sh
-rw-r--r--. 1 root root 11347 3月 15 11:51 LICENSE
-rwxr-xr-x. 1 root root 1881 3月 15 11:51 prepare
docker-compose.yml是安装harbor的方式,里面都是安装harbor所需要,如果我们想进行修改可以在里面进行修改,比如修改harbor的数据库
install.sh: 是一键安装harbor的指令
【2】编辑harbor配置文件
[root@localhost harbor]# cp harbor.yml.tmpl harbor.yml
[root@localhost harbor]# vi harbor.yml
# 1、如果所有机器都在一个局域网,那么配置内网IP
# 2、如果机器跨网络,只能通过公网访问,那么配置本机外网IP或域名
5 hostname: 192.168.235.10 #IP地址或者域名
# http related config
http:
# port for http, default is 80. If https enabled, this port will redirect to https port
port: 80
# https related config(https认证) 如果使用了https协议且端口是443,那么当使用http访问时,会自动跳转到https。
https:
# https port for harbor, default is 443
port: 443
# The path of cert and key files for nginx
certificate: /data/cert/192.168.235.10.crt
private_key: /data/cert/192.168.235.10.key
# Harbor admin的初始密码,只在第一次安装Harbor时有效
# 记住在启动Harbor后从UI更改管理员密码。
34 harbor_admin_password: Harbor12345
# 数据存储路径
47 data_volume: /data
【3】部署Harbor
修改完配置文件后,在当前目录执行./install.sh,Harbor服务就会根据当前目录下的docker-compose.yml开始下载依赖的镜像,检测并按照顺序依次启动。
使用install.sh一键安装,因为要下载好多镜像,所以需要等待一段时间
./install.sh
······
✔ ----Harbor has been installed and started successfully.----
配置Harbor
Harbor实现
Harbor的每个组件都是以Docker容器的形式构建的,官方也是使用Docker Compose来对它进行部署。用于部署Harbor的Docker Compose模板位于 harbor/docker-compose.yml,打开这个模板文件,发现Harbor是由7个容器组成的;
[root@localhost harbor]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
goharbor/redis-photon v2.4.2 61d136910774 3 weeks ago 158MB
goharbor/harbor-registryctl v2.4.2 f43545bdfd12 3 weeks ago 138MB
goharbor/registry-photon v2.4.2 1927be8b8775 3 weeks ago 80.8MB
goharbor/nginx-photon v2.4.2 4189bfe82749 3 weeks ago 47.3MB
goharbor/harbor-log v2.4.2 b2279d3a2ba5 3 weeks ago 162MB
goharbor/harbor-jobservice v2.4.2 d22f0a749835 3 weeks ago 222MB
goharbor/harbor-core v2.4.2 672a56385d29 3 weeks ago 199MB
goharbor/harbor-portal v2.4.2 bc60d9eaf4ad 3 weeks ago 56.3MB
goharbor/harbor-db v2.4.2 91d13ec46b2c 3 weeks ago 226MB
goharbor/prepare v2.4.2 d2100ed70ba4 3 weeks ago 269MB
[root@localhost harbor]# docker-compose ps
Name Command State Ports
------------------------------------------------------------------------------------------------------------------------------------------------
harbor-core /harbor/entrypoint.sh Up (healthy)
harbor-db /docker-entrypoint.sh 96 13 Up (healthy)
harbor-jobservice /harbor/entrypoint.sh Up (healthy)
harbor-log /bin/sh -c /usr/local/bin/ ... Up (healthy) 127.0.0.1:1514->10514/tcp
harbor-portal nginx -g daemon off; Up (healthy)
nginx nginx -g daemon off; Up (healthy) 0.0.0.0:80->8080/tcp,:::80->8080/tcp, 0.0.0.0:443->8443/tcp,:::443->8443/tcp
redis redis-server /etc/redis.conf Up (healthy)
registry /home/harbor/entrypoint.sh Up (healthy)
registryctl /home/harbor/start.sh Up (healthy)
nginx:nginx负责流量转发和安全验证,对外提供的流量都是从nginx中转,所以开放https的443端口,它将流量分发到后端的ui和正在docker镜像存储的dockerregistry;
harbor-jobservice: harbor的job管理模块,job在harbor里面主要是为了镜像仓库之前同步使用的;
harbor-ui: web管理页面,主要是前端的页面和后端CURD的接口;
registry: docker原生的仓库,负责保存镜像;
harbor-adminserver:harbor系统管理接口,可以修改系统配置以及获取系统信息;
harbor-db: harbor的数据库,这里保存了系统的job以及项目、人员权限管理。由于本harbor的认证也是通过数据,在生产环节大多对接到企业的ldap中;
harbor-log:harbor的日志服务,统一管理harbor的日志。通过inspect可以看出容器统一将日志输出的syslog;
这几个容器通过Docker link的形式连接在一起,在容器之间通过容器名字互相访问。对终端用户而言,只需要暴露proxy(即Nginx)的服务端口;
访问Harbor的管理界面,输入账号密码admin:Harbor12345
登录即可,访问地址:https://192.168.235.10/ ,并创建test项目
使用docker login命令访问Harbor镜像仓库
输入的用户和密码是harbor的用户和密码
[root@localhost ~]# docker login 192.168.235.10 -u admin -p Harbor12345
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
[root@localhost ~]# cat /root/.docker/config.json
{
"auths": {
"192.168.235.10": {
"auth": "YWRtaW46SGFyYm9yMTIzNDU="
}
}
}
测试
编写Dockerfile制作镜像
[root@localhost ~]# vim centos.yml
FROM centos:7
MAINTAINER ZHZ<168@qq.com>
RUN yum -y install vim lrzsz bind-utils &>/dev/null
ARG 最初版本
ENV TZ "Asia/Shanghai"
[root@localhost ~]# docker build -f centos.yml -t 192.168.235.10/test/centos:zhz .
将192.168.235.10/test/centos:zhz推入到harbor的test中
[root@localhost ~]# docker push 192.168.235.10/test/centos:zhz
The push refers to repository [192.168.235.10/test/centos]
e62aff74443a: Pushed
174f56854903: Pushed
zhz: digest: sha256:f42a34dfb70db0a93b172b9c0ba85eb3822e969cafbd9b8bca55ce98cf11235e size: 741
按照前文的方法,可以部署两台 Harbor 主机,一台作为 master,一台作为 slave。安装完成后,登录 master 主机的 Harbor,在【系统管理】->【仓库管理】可以添加 slave 主机的 Harbor 连接,然后配置其复制规则,便可实现 slave 主机自动备份 master 主机仓库。
Harbor 添加漏洞扫描
./prepare --with-clair --with-clair
docker-compose up -d