Centos7基于Harbor搭建企业级私有Docker仓库(单节点安装)
一、Harbor简介
-
1.Harbor介绍
Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器,通过添加一些企业必需的功能特性,例如安全、标识和管理等,扩展了开源Docker Distribution。作为一个企业级私有Registry服务器,Harbor提供了更好的性能和安全。提升用户使用Registry构建和运行环境传输镜像的效率。Harbor支持安装在多个Registry节点的镜像资源复制,镜像全部保存在私有Registry中, 确保数据和知识产权在公司内部网络中管控。另外,Harbor也提供了高级的安全特性,诸如用户管理,访问控制和活动审计等。
-
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,供日后进行分析。
各个组件之间的关系如下图所示:
-
4.Harbor实现
Harbor的每个组件都是以Docker容器的形式构建的,官方也是使用Docker Compose来对它进行部署。用于部署Harbor的Docker Compose模板位于 harbor/docker-compose.yml,打开这个模板文件,发现Harbor是由7个容器组成的;
[root@localhost harbor]# docker-compose ps Name Command State Ports --------------------------------------------------------------------------------------------- harbor-core /harbor/start.sh Up (healthy) harbor-db /entrypoint.sh postgres Up (healthy) 5432/tcp harbor-jobservice /harbor/start.sh Up 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) 80/tcp nginx nginx -g daemon off; Up (healthy) 0.0.0.0:80->80/tcp redis docker-entrypoint.sh redis ... Up 6379/tcp registry /entrypoint.sh /etc/regist ... Up (healthy) 5000/tcp registryctl /harbor/start.sh Up (healthy)
nginx:nginx负责流量转发和安全验证,对外提供的流量都是从nginx中转,所以开放https的443端口,它将流量分发到后端的ui和正在docker镜像存储的docker registry。
harbor-jobservice:harbor-jobservice 是harbor的job管理模块,job在harbor里面主要是为了镜像仓库之前同步使用的;
harbor-ui:harbor-ui是web管理页面,主要是前端的页面和后端CURD的接口;
registry:registry就是docker原生的仓库,负责保存镜像。
harbor-adminserver:harbor-adminserver是harbor系统管理接口,可以修改系统配置以及获取系统信息。
这几个容器通过Docker link的形式连接在一起,在容器之间通过容器名字互相访问。对终端用户而言,只需要暴露proxy (即Nginx)的服务端口。
harbor-db:harbor-db是harbor的数据库,这里保存了系统的job以及项目、人员权限管理。由于本harbor的认证也是通过数据,在生产环节大多对接到企业的ldap中;
harbor-log:harbor-log是harbor的日志服务,统一管理harbor的日志。通过inspect可以看出容器统一将日志输出的syslog。这几个容器通过Docker link的形式连接在一起,这样,在容器之间可以通过容器名字互相访问。对终端用户而言,只需要暴露proxy (即Nginx)的服务端口。
二、安装和配置Harbor
1.环境说明
环境名称 | 版本 |
---|---|
系统版本 | CentOS Linux release 7.6.1810 (Core) |
docker-ce | Docker version 18.06.3-ce, build d7080c1 |
docker-compose | docker-compose version 1.24.1, build 4667896b |
Harbor | v1.8.0 |
安装方式 | 离线安装 |
安装位置 | /usr/local/bin/harbor |
2.首先安装docker-ce
因为CentOS的安全限制,通过RKE安装K8S集群时候无法使用
root
账户。所以,建议CentOS
用户使用非root
用户来运行docker,不管是RKE
还是custom
安装k8s,详情查看无法为主机配置SSH隧道。
# 定义用户名
NEW_USER=rancher
# 添加用户(可选)
sudo adduser $NEW_USER
# 为新用户设置密码
sudo passwd $NEW_USER
# 为新用户添加sudo权限
sudo echo "$NEW_USER ALL=(ALL) ALL" >> /etc/sudoers
# 卸载旧版本Docker软件
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine \
container*
# 定义安装版本
export docker_version=18.06.3
# step 1: 安装必要的一些系统工具
sudo yum update -y;
sudo yum install -y yum-utils device-mapper-persistent-data \
lvm2 bash-completion;
# Step 2: 添加软件源信息
sudo yum-config-manager --add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo;
# Step 3: 更新并安装 Docker-CE
sudo yum makecache all;
version=$(yum list docker-ce.x86_64 --showduplicates | sort -r|grep ${docker_version}|awk '{print $2}');
sudo yum -y install --setopt=obsoletes=0 docker-ce-${version} docker-ce-selinux-${version};
# 如果已经安装高版本Docker,可进行降级安装(可选)
yum downgrade --setopt=obsoletes=0 -y docker-ce-${version} docker-ce-selinux-${version};
# 把当前用户加入docker组
sudo usermod -aG docker $NEW_USER;
Docker-engine
Docker-Engine Docker官方已经不推荐使用,请安装Docker-CE。
-
2.2 Docker配置
对于通过systemd来管理服务的系统(比如CentOS7.X、Ubuntu16.X), Docker有两处可以配置参数: 一个是
docker.service
服务配置文件,一个是Docker daemon配置文件daemon.json。配置镜像下载和上传并发数
从Docker1.12开始,支持自定义下载和上传镜像的并发数,默认值上传为3个并发,下载为5个并发。通过添加”max-concurrent-downloads”和”max-concurrent-uploads”参数对其修改:
配置镜像加速地址
Rancher从v1.6.15开始到v2.x.x,Rancher系统相关的所有镜像(包括1.6.x上的K8S镜像)都托管在Dockerhub仓库。Dockerhub节点在国外,国内直接拉取镜像会有些缓慢。为了加速镜像的下载,可以给Docker配置国内的镜像地址。
可以设置多个
registry-mirrors
地址,以数组形式书写,地址需要添加协议头(https或者http)。配置
insecure-registries
私有仓库Docker默认只信任TLS加密的仓库地址(https),所有非https仓库默认无法登陆也无法拉取镜像。
insecure-registries
字面意思为不安全的仓库,通过添加这个参数对非https仓库进行授信。可以设置多个insecure-registries
地址,以数组形式书写,地址不能添加协议头(http)。配置Docker存储驱动
OverlayFS是一个新一代的联合文件系统,类似于AUFS,但速度更快,实现更简单。Docker为OverlayFS提供了两个存储驱动程序:旧版的
overlay
,新版的overlay2
(更稳定)。先决条件:
overlay2
: Linux内核版本4.0或更高版本,或使用内核版本3.10.0-514+的RHEL或CentOS。overlay
: 主机Linux内核版本3.18+- 支持的磁盘文件系统
- ext4(仅限RHEL 7.1)
- xfs(RHEL7.2及更高版本),需要启用d_type=true。 >具体详情参考 Docker Use the OverlayFS storage driver
配置日志驱动
容器在运行时会产生大量日志文件,很容易占满磁盘空间。通过配置日志驱动来限制文件大小与文件的数量。 >限制单个日志文件为
100M
,最多产生3
个日志文件综合配置如下:
# 修改daemon.json [root@localhost harbor]# vim /etc/docker/daemon.json { "log-driver": "json-file", "log-opts": { "max-size": "100m", "max-file": "3" }, "insecure-registries":[ "172.16.218.145" ], "max-concurrent-downloads": 10, "max-concurrent-uploads": 10, "registry-mirrors": ["https://ryzw8bt9.mirror.aliyuncs.com"], "storage-driver": "overlay2", "storage-opts": [ "overlay2.override_kernel_check=true" ] }
3.安装docker-compose
必须先安装docker
方法一:二进制安装
a.下载二进制文件
[root@localhost harbor]# curl -L https://github.com/docker/compose/releases/download/1.24.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
如果需要安装其他版本的话,请修改上面命令中的版本号。
b.赋予二进制文件可执行权限
[root@localhost harbor]# chmod +x /usr/local/bin/docker-composels
c.根据自己的情况决定是否安装命令补全功能
[root@localhost harbor]# yum install bash-completion
[root@localhost harbor]# curl -L https://raw.githubusercontent.com/docker/compose/1.24.1/contrib/completion/bash/docker-compose -o /etc/bash_completion.d/docker-compose
重新登陆后就生效了
[root@localhost harbor]# docker-compose
build config down exec images logs port pull restart run start top up
bundle create events help kill pause ps push rm scale stop unpause version
d.测试是否安装成功
# docker-compose --version
[root@localhost harbor]# docker-compose version 1.24.1, build 4667896b
4.下载Harbor离线安装压缩包
安装方式分为在线安装和离线安装两种方式,我这里选择的是离线安装。
https://storage.googleapis.com/harbor-releases/release-1.8.0/harbor-offline-installer-v1.8.0.tgz
安装:
[root@localhost harbor]# cd /usr/local/bin/
[root@localhost harbor]# tar zxf harbor-offline-installer-v1.8.0.tgz
[root@localhost harbor]# cd /usr/local/bin/harbor/
[root@localhost harbor]# ls
common docker-compose.yml harbor.v1.8.0.tar.gz harbor.yml install.sh LICENSE prepare
5.修改配置文件
说明:从 1.8.0 后,harbor配置文件由原先的 harbor.cfg 改为 harbor.yml
配置文件为:/usr/local/bin/harbor/harbor.yml
-
比较重要的参数说明
- hostname 目标主机的主机名,用于访问Portal和注册表服务。它应该是目标计算机的IP地址或完全限定的域名(FQDN),例如,
192.168.1.10
或reg.yourdomain.com
。不要使用localhost
或127.0.0.1
作为主机名 - 外部客户端需要访问注册表服务
这里修改为我们的主机ip即可 例如修改为 172.16.218.145
-
data_volume: 存储 harbor 数据的位置。
-
harbor_admin_password:管理员的初始密码。此密码仅在Harbor首次启动时生效。之后,将忽略此设置,并且应在Portal中设置管理员密码。请注意,默认用户名/密码为admin / Harbor12345。
- hostname 目标主机的主机名,用于访问Portal和注册表服务。它应该是目标计算机的IP地址或完全限定的域名(FQDN),例如,
-
关于端口配置:
-
http:
- port:你的http的端口号
-
https:用于访问Portal和令牌/通知服务的协议。如果启用了公证,则必须设置为https。请参阅使用HTTPS访问配置Harbor。
- port:https的端口号
- certificate:SSL证书的路径,仅在协议设置为https时应用。
- private_key:SSL密钥的路径,仅在协议设置为https时应用。
-
6.执行安装
# 执行 ./prepare
[root@localhost harbor]# ./prepare
# 执行 ./install.sh
[root@localhost harbor]# ./install.sh
# 查看启动情况
[root@localhost harbor]# docker-compose ps
四、使用Harbor
1.配置免Https
修改 /etc/docker/daemon.json
[root@localhost harbor]# vim /etc/docker/daemon.json
# 加上 允许的仓库
{
"insecure-registries":[
"172.16.218.145"
]
}
2.重启docker和harbor
# 重启docker
[root@localhost harbor]# systemctl daemon-reload
[root@localhost harbor]# systemctl restart docker.service
# 重启harbor仓库
# cd 到 harbor的安装目录
[root@localhost harbor]# cd /usr/local/bin/harbor
# 执行命令
[root@localhost harbor]# docker-compose stop
[root@localhost harbor]# docker-compose up -d
3.登录
4.上传镜像
# linux 上登录harbor仓库
# 172.16.xx.xx 表示 linux服务器地址,请换成自己的服务器ip
# 注意要说明自己登陆哪个ip,不然默认会登陆到docker hub,即docker官方仓库,这不是我们想要的
[root@localhost harbor]# docker login 172.16.xx.xx
# 修改待上传镜像的tag
[root@localhost harbor]# docker tag nginx:1.17.1 172.16.218.145/test/nginx:1.17.1
# 上传镜像
[root@localhost harbor]# docker push 172.16.218.145/test/nginx:1.17.1
# 出现 类似下述信息 表示上传成功
1.17.1: digest: sha256:1e2ce8e6a852713d789c6315642d1483d1efdb4acee4699817810bef219ec93d size: 1366
5.查看镜像
6.如何pull镜像
[root@localhost bin]# docker pull 172.16.218.145/library/nginx:1.17.1
v.1.8.0: Pulling from library/nginx
4e360eca2e60: Pull complete
b08cc3be5c43: Pull complete
a750a309c85d: Pull complete
49b2d8335a1a: Pull complete
31e8f89dc042: Pull complete
Digest: sha256:1e2ce8e6a852713d789c6315642d1483d1efdb4acee4699817810bef219ec93d
Status: Downloaded newer image for 172.16.218.145/library/redis-photon:1.17.1
参考:
https://goharbor.io/
https://www.cnrancher.com/docs/rancher/v2.x/cn/install-prepare/registry/
https://www.cnblogs.com/pangguoping/p/7650014.html
https://www.cnblogs.com/haoprogrammer/p/11023926.html
https://www.jianshu.com/p/1409967439d6
https://www.cnblogs.com/kevingrace/p/6547616.html