part 1. Harbor概览
harbor:我们的使命是成为 Kubernetes 值得信赖的云原生存储库
为什么要使用Harbor?
Harbor是VMware公司开源的企业级容器镜像仓库管理平台,它提供了比基本Docker Registry更丰富的功能,特别适合企业环境使用。提供了镜像存储、签名、扫描、复制和图表管理等功能。
Harbor还包含了许多企业级功能,如:基于角色的访问控制(RBAC),LDAP集成,镜像复制,管理界面,自我注册,中文支持等
Harbor通过这些组件的协同工作,提供了一个全面的容器镜像和Helm图表管理解决方案。
Harbor的一些关键方面:
1. 用途
Harbor主要用于存储和管理Docker容器镜像,但它的功能远不止于此。它还可以管理Helm图表,这对于Kubernetes环境非常有用。
2. 私有化部署
虽然Docker官方提供了公共的Docker Hub,但从安全性和效率等方面考虑,企业往往需要自己的私有Registry。Harbor正是为此需求而生。 Harbor允许企业在自己的基础设施上部署私有Docker镜像仓库,这对于保护企业的知识产权和敏感信息至关重要。
3. 用户体验
Harbor提供了直观的Web界面,使得镜像管理变得简单。用户可以轻松地上传、下载镜像,管理项目和用户权限。
对于中国的企业用户来说,Harbor的中文界面支持可以降低使用门槛,提高操作效率。
Harbor的RBAC功能允许管理员精确控制谁可以访问哪些镜像,这在多团队协作的企业环境中尤为重要。
跨区域复制: 对于地理位置分散的企业,Harbor的镜像复制功能可以确保不同地区的团队都能快速访问所需的容器镜像。
4. 性能优化
相比于使用公共Docker Hub,使用本地部署的Harbor可以大大提高镜像的上传和下载速度,特别是在处理大型镜像时。
Harbor在处理大量并发请求和大型镜像时表现出色,适合大规模生产环境使用。
高可用: Harbor支持多节点部署,可以配置为高可用模式,确保服务的连续性。
持续集成/持续部署(CI/CD)支持: Harbor可以无缝集成到企业的CI/CD流程中,支持自动化的镜像构建、测试和部署。支持主流的CI/CD工具如Jenkins、GitLab CI等。
5. 安全性
镜像安全扫描: Harbor集成了漏洞扫描功能,可以自动检查上传的镜像是否存在已知的安全漏洞,提高了容器环境的安全性。Harbor集成了Trivy扫描引擎,可以自动扫描上传的镜像是否存在已知漏洞。它还支持内容信任,确保只有经过签名的镜像才能被部署。
审计和合规: Harbor提供了详细的操作日志,有助于满足企业的审计要求和合规需求。
使用Harbor的典型流程包括
- 开发者构建并推送镜像到Harbor
- Harbor自动扫描镜像的安全漏洞
- 运维人员在Harbor中管理镜像版本和访问权限
- 部署系统从Harbor拉取经过验证的镜像进行部署
part 2. Harbor 安装和配置
标准的 Harbor 安装过程包括以下阶段:
1. 确保您的目标主机满足 Harbor 安装先决条件。
首先需要准备一个满足以下条件的Linux服务器:harbor V2.5.0 配置要求
- Docker 17.06.0-ce+ 和 Docker Compose 1.18.0+
- 至少2GB内存和40GB磁盘空间
- 可以访问互联网(用于下载Harbor安装包和Docker镜像)
docker-compose下载
这里下载的版本是1.29.2
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version
2. 下载 Harbor 安装程序
访问Harbor的GitHub releases页面,下载v2.5.0的安装包,并解压。例如:
wget https://github.com/goharbor/harbor/releases/download/v2.5.0/harbor-online-installer-v2.5.0.tgz
tar xzvf harbor-online-installer-v2.5.0.tgz
以下是harbor的目录结构
harbor
├── LICENSE
├── common.sh
├── harbor.yml.tmpl
├── install.sh
└── prepare
- common.sh
- 这是一个通用的Shell脚本文件。
- 包含了一些公共函数和变量定义,被其他脚本(如install.sh)引用。
- 可能包含了一些辅助函数,例如错误处理、日志输出等通用功能。
- harbor.yml.tmpl
- 这是Harbor的配置模板文件。
- .tmpl后缀表示这是一个模板,用户需要基于此文件创建自己的配置文件。
- 包含了Harbor的各种配置选项,如数据库设置、存储路径、认证方式等。
- 用户通常需要复制此文件为harbor.yml,并根据自己的需求进行修改。
- install.sh
- 这是Harbor的主安装脚本。
- 负责执行整个Harbor的安装过程。
- 包括检查环境、准备配置、下载或加载镜像、启动服务等步骤。
- 用户通过运行这个脚本来完成Harbor的安装。
- prepare
- 这可能是一个可执行文件或脚本。
- 在安装过程中被install.sh调用。
- 主要负责准备Harbor运行所需的配置文件和环境。
- 可能包括生成证书、配置文件转换、创建必要的目录结构等任务。
3. 配置Harbor
进入解压后的目录,复制并编辑配置文件
cd harbor
cp harbor.yml.tmpl harbor.yml
vim harbor.yml# 查看自己的IP
curl ifconfig.me
部分配置文件
# Configuration file of Harbor# The IP address or hostname to access admin UI and registry service.
# DO NOT use localhost or 127.0.0.1, because Harbor needs to be accessed by external clients.
hostname: reg.mydomain.com# http related config
http:# port for http, default is 80. If https enabled, this port will redirect to https portport: 8080 # 这里我修改了# https related config
https:# https port for harbor, default is 443port: 443# The path of cert and key files for nginxcertificate: /your/certificate/pathprivate_key: /your/private/key/path# # Uncomment following will enable tls communication between all harbor components
# internal_tls:
# # set enabled to true means internal tls is enabled
# enabled: true
# # put your cert and key files on dir
# dir: /etc/harbor/tls/internal# Uncomment external_url if you want to enable external proxy
# And when it enabled the hostname will no longer used
# external_url: https://reg.mydomain.com:8433# The initial password of Harbor admin
# It only works in first time to install harbor
# Remember Change the admin password from UI after launching Harbor.
harbor_admin_password: Harbor12345# Harbor DB configuration
database:# The password for the root user of Harbor DB. Change this before any production use.password: root123# The maximum number of connections in the idle connection pool. If it <=0, no idle connections are retained.max_idle_conns: 100# The maximum number of open connections to the database. If it <= 0, then there is no limit on the number of open connections.# Note: the default number of connections is 1024 for postgres of harbor.max_open_conns: 900# The default data volume
data_volume: /data
在配置文件中,至少需要修改以下内容:
hostname
: 设置为你的服务器域名或IPharbor_admin_password
: 设置管理员密码- 注释掉https相关组件,这里使用http
配置安全性(可选)
为了提高安全性,建议配置HTTPS访问。这需要您有一个有效的SSL证书。配置步骤如下
Harbor docs | Configure HTTPS Access to Harbor,可根据官方文档配置
# 在harbor.yml中配置HTTPS
hostname: your_domain.com/IP
https:port: 443certificate: /your/certificate/pathprivate_key: /your/private/key/path# 然后重新运行安装脚本
./prepare
docker-compose down -v
docker-compose up -d
4. 运行安装脚本
执行安装脚本,这个过程可能需要几分钟,因为它会下载所需的Docker镜像。
注意要赋予权限,有一些提前下过的容器,要删除不然会冲突,这里我提前下过Nginx。还有要注意http的80端口是否被占用,可以修改http的端口为别的
sudo ./install.sh
这样就是成功了,后续修改了配置文件harbor.yml 要重新 install.sh,才能加载新的配置
docker ps,查看启动了哪些容器
5. 访问Harbor
安装完成后,您可以通过浏览器访问 http://your_server_ip:port
来登录Harbor。默认的管理员用户名是 admin
。如果你前面没修改密码,MM:Harbor12345
注意如果有添加到云服务的安全组的话,有自行配置一下,使端口通过,如果不行还需设置防火墙。这里的端口为我们前面设置的http的端口,也是上图中的nginx-photon下的8080端口
sudo ufw enable
sudo ufw allow 8080/tcp
sudo ufw status
默认的管理员用户名是 admin
。如果你前面没修改密码,MM:Harbor12345
6. 使用Harbor
登录后,就可以开始创建项目、管理用户和上传Docker镜像。例如,要推送镜像到Harbor,首先进行如下配置
添加不安全注册表: 配置中添加了 "insecure-registries": ["you_server_ip"]
。这告诉Docker允许与这个IP地址(ip)的不安全连接。通常,Docker要求使用HTTPS进行安全连接,但有时对于私有或测试环境,可能需要允许HTTP连接。
sudo tee /etc/docker/daemon.json <<-'EOF'{"insecure-registries": ["you_server_ip:port"]
}
EOFsudo systemctl daemon-reload
sudo systemctl restart docker
重启docker后,检查一下容器是否还在运行,与前面的容器对比,有些容器挂了
重新启动所有容器,docker ps查看容器状态。每次有容器挂了,就这样启动
sudo docker-compose downsudo docker-compose up -d
默认Password:Harbor12345,看到下面的条件就是登录成功了
ubuntu@ip-172-31-6-151:~/harbor$ docker login -uadmin you_server_ip:8080
Password:
WARNING! Your password will be stored unencrypted in /home/ubuntu/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credential-storesLogin Succeeded
点击推送命令,有详细的说明
在library项目中标记镜像,
SOURCE_IMAGE[:TAG] 要推送的docker镜像
REPOSITORY[:TAG] 这里是自己民命的
docker tag SOURCE_IMAGE[:TAG] you_server_ip:8080/library/REPOSITORY[:TAG]
推送镜像到library项目
docker push you_server_ip:8080/library/REPOSITORY[:TAG]
到这你应该就创建好了自己的镜像仓库,并且可以将镜像推送上去。后续拉取镜像非常方便
注意:使用别的机器拉取我们私有的镜像,还是需要配置,不安全注册表,
问题:账户或密码忘记
这里的serect_number,是你的账户和密码经过base64处理的
cat ~/.docker/config.json{"auths": {"you_server_ip:port": {"auth": "sercet_number"}}
}
base64解码,获取账户和密码
echo "secret_number" | base64 -d