搭建企业级的私有 Docker 镜像仓库

作者 : 开心源码 本文共7273个字,预计阅读时间需要19分钟 发布时间: 2022-05-12 共199人阅读

简介

私有镜像仓库可以方便企业,或者个人开发者共享内部镜像而不会泄漏私有代码,而且可以加速镜像的拉取。能更加方便得集成到容器化的 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 管理面板效果

先看看管理面板效果

系统环境及配置要求

资源配置说明
CPU2核 起步4核 更佳
Mem4GB 起步8GB 更佳
Disk40GB 起步160GB 更佳

硬盘主要存储镜像,镜像量大可以考虑加大。

软件要求:

软件版本说明
Python2.7 以上Linux 服务器基本都安装了 2.7 版本,可以 python 尝试,未装的装上
Docker1.10 以上《CentOS 安装 Docker》
Docker Compose1.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

以上配置作了处地方修改:

  1. 将所有挂载的目录更改为 /data/harbor
  2. 将 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 driverCreating harbor-log ... doneCreating harbor-adminserver ... doneCreating harbor-db          ... doneCreating registry           ... doneCreating redis              ... doneCreating harbor-ui          ... doneCreating harbor-jobservice  ... doneCreating 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  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 -vStopping harbor-jobservice  ... doneStopping nginx              ... doneStopping harbor-ui          ... doneStopping registry           ... doneStopping harbor-adminserver ... doneStopping redis              ... doneStopping harbor-db          ... doneStopping harbor-log         ... doneRemoving harbor-jobservice  ... doneRemoving nginx              ... doneRemoving harbor-ui          ... doneRemoving registry           ... doneRemoving harbor-adminserver ... doneRemoving redis              ... doneRemoving harbor-db          ... doneRemoving harbor-log         ... doneRemoving network harbor_harbor[root@test-node harbor]#

新建客户,开始推着镜像

新建一个 os 客户

新建好之后,需要先设置为管理员,否则推送时会显示验证不通过。

新建一个项目

新建一个项目

Docker 用户端登录

$ docker login hub.zhoujiangang.com:41533Username: osPassword:Login Succeeded

输入新建账号的账号密码,登录成功后可以进行推送镜像。

升级镜像 tag 名,推送镜像

$ docker tag docker tag ubuntu:latest hub.zhoujiangang.com:41533/os/ubuntu:latest$ docker push hub.zhoujiangang.com:41533/os/ubuntuThe push refers to repository [hub.zhoujiangang.com:41533/os/ubuntu]b9b7103af585: Pushedca2991e4676c: Pusheda768c3f3878e: Pushedbc7f4b25d0ae: Pushedlatest: digest: sha256:acd85db6e4b18aafa7fcde5480872909bd8e6d5fbd4e5e790ecc09acc06a8b78 size: 1150

显示推送成功。 镜像推送成功,服务端查看

小结

整个私有镜像就搭建完成了,当然这只是一个简易的入门教程,还有很多配置需要在 harbor.cfg 中作修改、调优才能用到生产环境。本文权当抛砖引玉,希望能有所帮助。
还没有服务器?趁活动底价入一台吧

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » 搭建企业级的私有 Docker 镜像仓库

发表回复