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

简介

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

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

  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 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]#

新建用户,开始推着镜像

新建一个 os 用户

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

新建一个项目

新建一个项目

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 中作修改、调优才能用到生产环境。本文权当抛砖引玉,希望能有所帮助。
还没有服务器?趁活动底价入一台吧

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,386评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,939评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,851评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,953评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,971评论 5 369
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,784评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,126评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,765评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,148评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,744评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,858评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,479评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,080评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,053评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,278评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,245评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,590评论 2 343

推荐阅读更多精彩内容