搭建私有docker registry

为什么要搭建私有docker registry?

  1. 外网访问官方的registry速度很慢,而国内的registry服务大多需要花钱。私有registry免费,搭建之后,能使内网的主机加快访问速度,对CI,CD的效率有很大提升。
  2. 能有效保护内部代码,防止放到公网泄漏出去。

搭建及运行registry:

拉取registry镜像

docker pull registry:2

运行registry

// 将registry的数据卷与本地关联,便于管理和备份registry数据
docker run -d -p 5000:5000 --name registry -v /mnt/docker/data/registry:/var/lib/registry registry:2

测试本地registry

// 首先为本地镜像打tag
docker tag ubuntu localhost:5000/ubuntu

// 查看镜像会发现多出一个镜像:
[~]$ docker images
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
localhost:5000/ubuntu   latest              4ca3a192ff2a        6 days ago          128.2 MB
ubuntu                  latest              4ca3a192ff2a        6 days ago          128.2 MB
registry                2                   c9bd19d022f6        6 weeks ago         33.27 MB

// push 到registry
docker push localhost:5000/ubuntu

// 从本地registry拉取刚才提交的镜像
// 首先删除刚才创建的镜像
docker rmi localhost:5000/ubuntu
// 从registry拉取
docker pull localhost:5000/ubuntu

本地可以查看registry里包含的镜像数据

// 进入之前run registry时关联的数据卷,发现里面已经刚才push的ubuntu镜像
[~]$ cd /mnt/docker/data/registry && ls docker/registry/v2/repositories/
ubuntu
// 

配置外网可访问registry

外网访问registry需要使用https协议做安全认证,不然docker pull/docker push都会失败。
下面是几种配置方式。(操作系统均为centOS7)

方法一:配置参数--insecure-registry

这种方式最简单,但不安全。
配置docker客户端,添加参数,允许访问registry时候不适用https安全认证。

vi /lib/systemd/system/docker.service
# 添加内容
ExecStart=/usr/bin/dockerd --insecure-registry 192.168.100.9:5000

配置后重启docker

方法二:配置https服务。(推荐)。

ssl证书,可以向CA机构申请。也可以配置自签名证书。
使用CA证书访问远程registry使用域名访问。步骤:

  1. 生成自认证证书:
sudo mkdir -p certs && sudo openssl req \
-newkey rsa:4096 -nodes -sha256 -keyout certs/domain.key \
-x509 -days 365 -out certs/domain.crt
:
output:
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:
Locality Name (eg, city) [Default City]:
Organization Name (eg, company) [Default Company Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:mydockerhub.com // **注意Common Name一项填写域名**
Email Address []:
  1. 启动带有认证的registry
docker run -d -p 5000:5000 --name registry \
-v `pwd`certs:/certs \
-v /mnt/docker/data/registry:/var/lib/registry \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
-e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
registry:2
  1. 将证书文件certs/domain.crt复制到docker客户端的宿主机上/etc/docker/certs.d/mydockerhub.com:5000/ca.crt
    注意!需要重启docker daemon: systemctl restart docker

  2. docker客户端使用域名访问registry

docker push mydockerhub.com:5000/centos
  1. 如果域名mydockerhub.com尚未指向registry宿主机的ip地址,可以修改hosts文件,将ip与域名做关联。ip还配置局域网地址,这样能加快上传下载速度。
vi /etc/hosts
192.168.0.2 mydockerhub.com

参考:
https://docs.docker.com/registry/deploying/#get-a-certificate
https://docs.docker.com/registry/insecure/

Update: 2016-01-17
更加通用的做法是,使用nginx做https服务器,将数据转发给registry服务。这样,registry服务就不用配置ssl了。
修改上面的2-5步。当然如果购买CA认证证书,可以不用自己生成的证书,这样连第一步也不需要了。

  • 配置nginx
server {
    client_max_body_size 0;
    listen 443 ssl;
    server_name registry.yourhost.com;
    ssl_certificate   /mnt/cert/your-cert.pem;
    ssl_certificate_key  /mnt/cert/your-cert.key;
    ssl_session_timeout 10m;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    location /v2/ {
      proxy_read_timeout      900;
      proxy_connect_timeout   300;
      proxy_redirect          off;

      proxy_set_header    Host                $http_host;
      proxy_set_header    X-Real-IP           $remote_addr;
      proxy_set_header    X-Forwarded-For     $proxy_add_x_forwarded_for;
      proxy_set_header  X-Forwarded-Proto $scheme;

      proxy_pass http://127.0.0.1:5000;
    }
}

  • docker客户端访问registry
docker push registry.yourhost.com/centos
  • 如果需要鉴权,在nginx.conf中配置访问权限
auth_basic "Registry realm"; 
auth_basic_user_file /mnt/htpasswd/registry.htpasswd;

生成账号密码的命令:

htpasswd -Bbn username password >> /mnt/htpasswd/registry.htpasswd
  • 查看registry中已有的docker images和tags:
curl -X GET your-registry-ip/v2/_catalog | python -mjson.tool
curl -X GET your-registry-ip/v2/nginx/tags/list | python -mjson.tool

搭建Harbor服务。

Harbor是vmware公司开源的用于企业级docker registry服务。它提供了web-ui界面,角色管理,LDAP支持,restful API等功能,项目地址:https://github.com/vmware/harbor
我们可以搭建Harbor来代替docker registry。安装的过程参考:https://github.com/vmware/harbor/blob/master/docs/installation_guide.md

  • 下载官方离线包,并解压缩。
wget https://github.com/vmware/harbor/releases/download/0.5.0/harbor-offline-installer-0.5.0.tgz 
tar xvf harbor-offline-installer-0.5.0.tgz
  • 修改harbor.cfg配置
    具体的字段含义安装文档,我只修改以少部分字段,其他的都是用的默认值。
# 域名配置
hostname = registry.youhost.com

# 腾讯企业邮箱email配置
email_server = smtp.exmail.qq.com
email_server_port = 25
email_username = docker@yourhost.com
email_password = yourpassword
email_from = docker<dokcer@yourhost.com>
email_ssl = false

文件内有个ui_url_protocol字段,意思是,使用http还是https协议访问UI。
docker的registry在远程访问时必须使用https协议(除非加上参数--insecure-registry, 不建议)。
但这个字段可以就使用默认值(http),然后通过服务器上的nginx监听https,做端口转发到harbor的nginx上即可。

  • 修改docker-compose.yml文件
    由于我们在服务器上已经配置了nginx,所以需要修改harbor的nginx服务的默认监听端口80,改成8888。
  proxy:
    image: nginx:1.11.5
    ......
    ports:
      - 8888:80
      - 443:443

修改所有mount的文件路径,默认是在/data下,这步可选。

  • 修改common/templates/registry/config.yml文件,在ui_url后面添加端口号8888:
realm: $ui_url:8888/service/token
  • 配置服务器端的nginx.conf:
server {
  listen 80;
  server_name docker.youhost.net;
  return 301 https://$host$request_uri;
}

server {
    client_max_body_size 0;
    listen 443;
    server_name docker.youhost.net;
    ssl on;
    ssl_certificate   /mnt/cert/yourcert.pem;
    ssl_certificate_key  /mnt/cert/yourcert.key;
    ssl_session_timeout 10m;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    location / {
      proxy_read_timeout      300;
      proxy_connect_timeout   300;
      proxy_redirect          off;

      proxy_http_version 1.1;

      proxy_set_header    Host                $http_host;
      proxy_set_header    X-Real-IP           $remote_addr;
      proxy_set_header    X-Forwarded-For     $proxy_add_x_forwarded_for;

      proxy_pass http://127.0.0.1:8888;
    }
}
  • 启动服务
./install.sh

至此,一个harbor服务就搭建完成了。在浏览器内访问UI页面:

harbor.png

默认账号/密码:admin/Harbor12345 。可以在harbor.cfg内修改。

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

推荐阅读更多精彩内容