Harbor 搭建笔记 | 个人豪华私域容器镜像仓库
乐果 发表于 2023 年 10 月 20 日 标签:harborDocker
Harbor是什么
Harbor是一个用于存储和分发Docker
镜像的企业级Registry
服务器,通过添加一些企业必需的功能特性,例如安全、标识和管理等,扩展了开源Docker Distribution
。
作为一个企业级私有Registry
服务器,Harbor提供了更好的性能和安全。提升用户使用Registry
构建和运行环境传输镜像的效率。
为什么使用bitnami的镜像安装harbor
- 首先你可能无法正常访问
github
, 而harbor
依赖于nginx
、db
、redis
等多个软件平台,采用docker-compose
安装相对优雅; - 其次
harbor
官方并没有直接提供docker-compose
; - bitnami是一个比较成熟知名的容器镜像提供商;
- 最后一点,也是我最看中的:因为bitnami有
arm
架构的镜像, 而我正好计划将harbor
搭建在orangepi
里,使用bitnami镜像搭建就不用我在折腾去编译arm
架构的镜像了!
bitnami官方文档安装harbor(不推荐,可能失败)
官方镜像地址:https://hub.docker.com/r/bitnami/harbor-portal
首先我们看一下bitnami的官方文档,仅需三行命令就可以安装harbor
了。
$ curl -LO https://raw.githubusercontent.com/bitnami/containers/main/bitnami/harbor-portal/docker-compose.yml
$ curl -L https://github.com/bitnami/containers/archive/main.tar.gz | tar xz --strip=1 --wildcards '*-main/bitnami/harbor-portal/config' && mv bitnami/harbor-portal/config . && rm -rf bitnami
$ docker-compose up
官方文档错误情况
但我在mac系统下面测试,上面的命令可能会出现很多异常情况,比如
错误1:
tar: Option --wildcards is not supported
错误2:
curl: (23) Failure writing output to destination
错误3:
你可能直接访问不了github 😄
正确安装方式(推荐)
整个安装流程清晰,可以兼容mac、win、linux等操作系统
你完全可以不采用命令的方式进行以下操作,比如下载解压文件等
// 下载bitnami官方压缩包
wget https://github.com/bitnami/containers/archive/main.tar.gz
// 解压
tar zxvf main.tar.gz
// 将harbor-portal目录移动到我们的当前目录
mv containers-main/bitnami/harbor-portal .
cd harbor-portal
// 启动portal
docker compose up
执行完上面的命令,不出意外你将成功启动一套harbor系统。
当然,你也可以查看容器编排的配置文件docker-compose.yml
,提前修改一些参数,
如下ls命令,配置文件就在当前目录下:
ls
2 config docker-compose.yml README.md
例如我的docker-compose.yml
文件如下:
# Copyright VMware, Inc.
# SPDX-License-Identifier: APACHE-2.0
version: '2'
services:
registry:
image: docker.io/bitnami/harbor-registry:2
environment:
- REGISTRY_HTTP_SECRET=CHANGEME
volumes:
- registry_data:/storage
- ./config/registry/:/etc/registry/:ro
registryctl:
image: docker.io/bitnami/harbor-registryctl:2
environment:
- CORE_SECRET=CHANGEME
- JOBSERVICE_SECRET=CHANGEME
- REGISTRY_HTTP_SECRET=CHANGEME
volumes:
- registry_data:/storage
- ./config/registry/:/etc/registry/:ro
- ./config/registryctl/config.yml:/etc/registryctl/config.yml:ro
postgresql:
image: docker.io/bitnami/postgresql:13
container_name: harbor-db
environment:
- POSTGRESQL_PASSWORD=bitnami
- POSTGRESQL_DATABASE=registry
volumes:
- postgresql_data:/bitnami/postgresql
core:
image: docker.io/bitnami/harbor-core:2
container_name: harbor-core
depends_on:
- registry
environment:
- CORE_KEY=change-this-key
- _REDIS_URL_CORE=redis://redis:6379/0
- SYNC_REGISTRY=false
- CHART_CACHE_DRIVER=redis
- _REDIS_URL_REG=redis://redis:6379/1
- PORT=8080
- LOG_LEVEL=info
# 下面这里是你Harbor访问的地址,根据自己情况修改
- EXT_ENDPOINT=http://rusuo.cc
- DATABASE_TYPE=postgresql
- REGISTRY_CONTROLLER_URL=http://registryctl:8080
- POSTGRESQL_HOST=postgresql
- POSTGRESQL_PORT=5432
- POSTGRESQL_DATABASE=registry
- POSTGRESQL_USERNAME=postgres
- POSTGRESQL_PASSWORD=bitnami
- POSTGRESQL_SSLMODE=disable
- REGISTRY_URL=http://registry:5000
- TOKEN_SERVICE_URL=http://core:8080/service/token
- HARBOR_ADMIN_PASSWORD=bitnami
- CORE_SECRET=CHANGEME
- JOBSERVICE_SECRET=CHANGEME
- ADMIRAL_URL=
- CORE_URL=http://core:8080
- JOBSERVICE_URL=http://jobservice:8080
- REGISTRY_STORAGE_PROVIDER_NAME=filesystem
- REGISTRY_CREDENTIAL_USERNAME=harbor_registry_user
- REGISTRY_CREDENTIAL_PASSWORD=harbor_registry_password
- READ_ONLY=false
- RELOAD_KEY=
volumes:
# 下面这里是存放镜像仓库的目录,根据自己情况修改挂载宿主机的目录
- core_data:/data
- ./config/core/app.conf:/etc/core/app.conf:ro
- ./config/core/private_key.pem:/etc/core/private_key.pem:ro
portal:
image: docker.io/bitnami/harbor-portal:2
container_name: harbor-portal
depends_on:
- core
jobservice:
image: docker.io/bitnami/harbor-jobservice:2
container_name: harbor-jobservice
depends_on:
- redis
- core
environment:
- CORE_SECRET=CHANGEME
- JOBSERVICE_SECRET=CHANGEME
- CORE_URL=http://core:8080
- REGISTRY_CONTROLLER_URL=http://registryctl:8080
- REGISTRY_CREDENTIAL_USERNAME=harbor_registry_user
- REGISTRY_CREDENTIAL_PASSWORD=harbor_registry_password
volumes:
- jobservice_data:/var/log/jobs
- ./config/jobservice/config.yml:/etc/jobservice/config.yml:ro
redis:
image: docker.io/bitnami/redis:7.0
environment:
# ALLOW_EMPTY_PASSWORD is recommended only for development.
- ALLOW_EMPTY_PASSWORD=yes
harbor-nginx:
image: docker.io/bitnami/nginx:1.25
container_name: nginx
volumes:
- ./config/proxy/nginx.conf:/opt/bitnami/nginx/conf/nginx.conf:ro
ports:
- '8080:8080'
depends_on:
- postgresql
- registry
- core
- portal
volumes:
registry_data:
driver: local
core_data:
driver: local
jobservice_data:
driver: local
postgresql_data:
driver: local
harbor默认账号密码
采用本文方法安装的harbor环境,账号密码等信息其实都在harbor-portal/docker-compose.yml文件中,你可以自行查看,比如web面板账号密码如下:
http://localhost/account/sign-in
用户名:admin
密码:bitnami
使用Harbor时可能会遇到的问题
Harbor虽然可以通过 web 方式访问了,但 push 或 pull 镜像时可能会有报错。
1、docker login 时报错:
docker login rusuo.cc
Username: xiao
Password:
Error saving credentials: error storing credentials - err: exit status 1, out: `Post "https://hub.docker.com/v2/users/login?refresh_token=true": context deadline exceeded (Client.Timeout exceeded while awaiting headers)`
处理方法:
vim ~/.docker/config.json
{
"auths": {
"https://index.docker.io/v1/": {},
"hub.wesais.cn": {},
//注意,加上下面这行,也就是你搭建的Harbor域名地址
"rusuo.cc": {}
},
"credsStore": "desktop"
}
2、push或 pull 时报错:
ERROR: received unexpected HTTP status: 503 unable to connect to 156.255.2.178:80. Do you need an HTTP proxy?
处理方法:
可能因为web只开启了 https,push 或 pull 时需要 http 方式,将 web服务的 http 开启(即默认 80 端口)即可。
3、docker push harbor 反复Retrying in XXX second
docker push rusuo.cc/edge/ppos-mirouter:v.23.1020
The push refers to repository [rusuo.cc/edge/ppos-mirouter]
ef306617e890: Pushing [==================================================>] 21.74MB/21.74MB
c859152d3cf8: Pushing 2.048kB
95524ed72349: Pushing [=======================> ] 66.54MB/140.6MB
24302eb7d908: Retrying in 1 second
unexpected EOF
如上,反复Retrying后又重新反复push,最终超时EOF
处理方法 :
修改配置文件: common/config/registry/config.yml
如上图,修改了:
http:
relativeurls: true
然后重启harbor服务即可:
docker compose down
docker compose up -d