简介
私有镜像仓库可以方便企业,或个人开发者共享内部镜像而不会泄漏私有代码,而且可以加速镜像的拉取。能更加方便得集成到容器化的 CI/CD
中去。也可建立自己的公共镜像仓库。
首发地址:https://www.zhoujiangang.com/p/use-harbor-create-private-registries/
会持续修改的文章,请关注原博客。
还没有服务器?快入一台 2018 年阿里云双 12 底价服务器吧!
背景
在没有使用 《镜像加速配置》(可参考前半部分配置) 的时候。
- 公司或个人项目代码不能公开,如何共享镜像或快速发布?直接共享
Dockerfile
用时build
吗? - 在国内直接拉取官方镜像非常缓慢。如何才能快速取官方基础镜像呢?
- 国内的网络环境下,项目在
CI/CD
过程中拉取镜像可能会花费比较多的时间,如何能加快拉取镜像的速度?
没错,搭建私有镜像仓库吧。
方案选择
搭建私有镜像仓库有几种方式:
- 官方
registry
推荐使用registry:2
v2 版本的镜像 -
harbor
方案, 则是在官方的基础上增加了权限控制、界面化等功能
这里主要说说 harbor
的搭建。
开始
先看看 harbor
管理面板效果
系统环境及配置要求
资源 | 配置 | 说明 |
---|---|---|
CPU | 2核 起步 | 4核 更佳 |
Mem | 4GB 起步 | 8GB 更佳 |
Disk | 40GB 起步 | 160GB 更佳 |
硬盘主要存储镜像,镜像量大可以考虑加大。
软件要求:
软件 | 版本 | 说明 |
---|---|---|
Python | 2.7 以上 | Linux 服务器基本都安装了 2.7 版本,可以 python 尝试,未装的装上 |
Docker | 1.10 以上 | 《CentOS 安装 Docker》 |
Docker Compose | 1.6.0 以上 | 《安装 docker-compose》 |
Openssl | 推荐用最高版本 | 生成证书,自备证书的忽略 |
安装
安装步骤:
- 下载安装器
- 修改配置文件
harbor.cfg
- 运行
install.sh
执行安装,此 shell 脚本会生成所需要的配置文件,调用docker-compose
来进行镜像拉取及启动。
harbor
有两种方式进行安装。分为离线和在线,如果网络环境不佳可以先择离线安装。
这里选择在线方式(拉取远程镜像来安装)安装:
本示例使用当前最新稳定版本 v1.6.3
下载安装器:
$ wget https://storage.googleapis.com/harbor-releases/release-1.6.0/harbor-online-installer-v1.6.3.tgz
想要离线的可以使用(离线版本会比较大):
$ wget https://storage.googleapis.com/harbor-releases/release-1.6.0/harbor-offline-installer-v1.6.3.tgz
解压安装程序:
$ tar -zxvf harbor-offline-installer-v1.6.3.tgz
修改配置文件:
$ cd harbor
$ vim harbor.cfg
修改以下部分:
hostname = hub.zhoujiangang.com:41533 # 修改为你自己的域名,由于我机子端口限制,所以改为非 443,如果 443 可以给镜像仓库使用,则可以直接用 `hub.zhoujiangang.com`
ui_url_protocol = https # 最好换成 https 吧,如果想用 `http` 的话,需要在客户端设置支持 `http` 访问,需要重启服务。
...
ssl_cert = /data/harbor/cert/hub.zhoujiangang.com.crt # 对于目录没有要求的可以不改,由于 data 目录下有很多其它项目,所以作此修改
ssl_cert_key = /data/harbor/cert/hub.zhoujiangang.com.key # 对于目录没有要求的可以不改,由于 data 目录下有很多其它项目,所以作此修改
harbor_admin_password = Harbor12345 # 修改管理面板的登录密码
修改 docker-compose.yml
文件, 不关心安装位置、端口的可以忽略。默认 docker-compose.yml
日志放在 var/logs/
下,端口开放 80
, 443
, 4443
, 由于这些端口我已经被占用,需要修改。
先创建根文件夹,把所有数据全放在 /data/harbor
下面,便于以后查看。
$ mkdir -p /data/harbor
当前使用自备证书的方式,免去了所有客户端手动添加信任的操作。
还没有证书可以参考这里 《轻松全站 HTTPS,还没用上 https (可申请泛域名证书)的朋友可以操练起来了》 只要有域名,轻松申请证书。
也可以手动使用 openssl 来申请证书,只要设置双方信任即可,可参考官方配置文档 《Configuring Harbor with HTTPS Access》
用以上方法申请好证书后,把申请好的证书移动到 ssl_cert
, ssl_cert_key
配置的目录中去。
注意
如果是使用 acme.sh
申请的,则可作如下配置:
ssl_cert = ~/.acme.sh/zhoujiangang.com/fullchain.cer # 实在要这么配置,最好把路径改为绝对路径 ~ 在不用用户表示不同的位置。
ssl_cert_key = ~/.acme.sh/zhoujiangang.com/hub.zhoujiangang.com.key # 实在要这么配置,最好把路径改为绝对路径 ~ 在不用用户表示不同的位置。
不过建议进行改名,并移动到 /data/harbor/cert
目录下
$ mkdir -p /data/harbor/cert
$ cp ~/.acme.sh/zhoujiangang.com/fullchain.cer /data/harbor/cert/hub.zhoujiangang.com.crt
$ cp ~/.acme.sh/zhoujiangang.com/hub.zhoujiangang.com.key /data/harbor/cert/hub.zhoujiangang.com.key
证书设置完成后,可进行 docker-compose.yml
的配置。
可直接用如下配置:
version: '2'
services:
log:
image: goharbor/harbor-log:v1.6.3
container_name: harbor-log
restart: always
volumes:
- /data/harbor/log/:/var/log/docker/:z
- ./common/config/log/:/etc/logrotate.d/:z
ports:
- 127.0.0.1:1514:10514
networks:
- harbor
registry:
image: goharbor/registry-photon:v2.6.2-v1.6.3
container_name: registry
restart: always
volumes:
- /data/harbor/registry:/storage:z
- ./common/config/registry/:/etc/registry/:z
- ./common/config/custom-ca-bundle.crt:/harbor_cust_cert/custom-ca-bundle.crt:z
networks:
- harbor
environment:
- GODEBUG=netdns=cgo
depends_on:
- log
logging:
driver: "syslog"
options:
syslog-address: "tcp://127.0.0.1:1514"
tag: "registry"
postgresql:
image: goharbor/harbor-db:v1.6.3
container_name: harbor-db
restart: always
volumes:
- /data/harbor/database:/var/lib/postgresql/data:z
networks:
- harbor
env_file:
- ./common/config/db/env
depends_on:
- log
logging:
driver: "syslog"
options:
syslog-address: "tcp://127.0.0.1:1514"
tag: "postgresql"
adminserver:
image: goharbor/harbor-adminserver:v1.6.3
container_name: harbor-adminserver
env_file:
- ./common/config/adminserver/env
restart: always
volumes:
- /data/harbor/config/:/etc/adminserver/config/:z
- /data/harbor/secretkey:/etc/adminserver/key:z
- /data/harbor/:/data/:z
networks:
- harbor
depends_on:
- log
logging:
driver: "syslog"
options:
syslog-address: "tcp://127.0.0.1:1514"
tag: "adminserver"
ui:
image: goharbor/harbor-ui:v1.6.3
container_name: harbor-ui
env_file:
- ./common/config/ui/env
restart: always
volumes:
- ./common/config/ui/app.conf:/etc/ui/app.conf:z
- ./common/config/ui/private_key.pem:/etc/ui/private_key.pem:z
- ./common/config/ui/certificates/:/etc/ui/certificates/:z
- /data/harbor/secretkey:/etc/ui/key:z
- /data/harbor/ca_download/:/etc/ui/ca/:z
- /data/harbor/psc/:/etc/ui/token/:z
networks:
- harbor
depends_on:
- log
- adminserver
- registry
logging:
driver: "syslog"
options:
syslog-address: "tcp://127.0.0.1:1514"
tag: "ui"
jobservice:
image: goharbor/harbor-jobservice:v1.6.3
container_name: harbor-jobservice
env_file:
- ./common/config/jobservice/env
restart: always
volumes:
- /data/harbor/job_logs:/var/log/jobs:z
- ./common/config/jobservice/config.yml:/etc/jobservice/config.yml:z
networks:
- harbor
depends_on:
- redis
- ui
- adminserver
logging:
driver: "syslog"
options:
syslog-address: "tcp://127.0.0.1:1514"
tag: "jobservice"
redis:
image: goharbor/redis-photon:v1.6.3
container_name: redis
restart: always
volumes:
- /data/harbor/redis:/var/lib/redis
networks:
- harbor
depends_on:
- log
logging:
driver: "syslog"
options:
syslog-address: "tcp://127.0.0.1:1514"
tag: "redis"
proxy:
image: goharbor/nginx-photon:v1.6.3
container_name: nginx
restart: always
volumes:
- ./common/config/nginx:/etc/nginx:z
networks:
- harbor
ports:
- 41522:80
- 41533:443
- 41534:4443
depends_on:
- postgresql
- registry
- ui
- log
logging:
driver: "syslog"
options:
syslog-address: "tcp://127.0.0.1:1514"
tag: "proxy"
networks:
harbor:
external: false
以上配置作了处地方修改:
- 将所有挂载的目录更改为
/data/harbor
- 将 nginx 块配置,暴露的端口修改为(由于我测试的机子 80,443 都已经被占用,如果你希望将这些端口给 harbor 使用,则可改回去)
ports:
- 41522:80
- 41533:443
- 41534:4443
直接使用 80
, 443
提供服务, 可改回之前的配置
ports:
- 80:80
- 443:443
- 4443:4443
全部配置完成,开始安装
$ ./install.sh
执行成功可以看到有如下输出:
...
[Step 2]: checking existing instance of Harbor ...
[Step 3]: starting Harbor ...
Creating network "harbor_harbor" with the default driver
Creating harbor-log ... done
Creating harbor-adminserver ... done
Creating harbor-db ... done
Creating registry ... done
Creating redis ... done
Creating harbor-ui ... done
Creating harbor-jobservice ... done
Creating nginx ... done
✔ ----Harbor has been installed and started successfully.----
Now you should be able to visit the admin portal at https://hub.zhoujiangang.com:41533.
For more details, please visit https://github.com/goharbor/harbor .
[root@test-node harbor]#
执行成功后,你可以访问 https://hub.zhoujiangang.com:41533
来访问管理面板。在配置 harbor.cfg
时没有修改密码的话,默认的账号为 admin
密码为 Harbor12345
删除 harbor
使用 docker-compose down -v
[root@test-node harbor]# docker-compose down -v
Stopping harbor-jobservice ... done
Stopping nginx ... done
Stopping harbor-ui ... done
Stopping registry ... done
Stopping harbor-adminserver ... done
Stopping redis ... done
Stopping harbor-db ... done
Stopping harbor-log ... done
Removing harbor-jobservice ... done
Removing nginx ... done
Removing harbor-ui ... done
Removing registry ... done
Removing harbor-adminserver ... done
Removing redis ... done
Removing harbor-db ... done
Removing harbor-log ... done
Removing network harbor_harbor
[root@test-node harbor]#
新建用户,开始推着镜像
新建好之后,需要先设置为管理员,否则推送时会显示验证不通过。
新建一个项目
在 Docker
客户端登录
$ docker login hub.zhoujiangang.com:41533
Username: os
Password:
Login Succeeded
输入新建账号的账号密码,登录成功后可以进行推送镜像。
更新镜像 tag
名,推送镜像
$ docker tag docker tag ubuntu:latest hub.zhoujiangang.com:41533/os/ubuntu:latest
$ docker push hub.zhoujiangang.com:41533/os/ubuntu
The push refers to repository [hub.zhoujiangang.com:41533/os/ubuntu]
b9b7103af585: Pushed
ca2991e4676c: Pushed
a768c3f3878e: Pushed
bc7f4b25d0ae: Pushed
latest: digest: sha256:acd85db6e4b18aafa7fcde5480872909bd8e6d5fbd4e5e790ecc09acc06a8b78 size: 1150
显示推送成功。 小结
整个私有镜像就搭建完成了,当然这只是一个简易的入门教程,还有很多配置需要在 harbor.cfg
中作修改、调优才能用到生产环境。本文权当抛砖引玉,希望能有所帮助。
还没有服务器?趁活动底价入一台吧