CICD工作专题

搭建私有docker registry

2016-12-06  本文已影响1944人  mr_franklin

为什么要搭建私有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认证证书,可以不用自己生成的证书,这样连第一步也不需要了。

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 push registry.yourhost.com/centos
auth_basic "Registry realm"; 
auth_basic_user_file /mnt/htpasswd/registry.htpasswd;

生成账号密码的命令:

htpasswd -Bbn username password >> /mnt/htpasswd/registry.htpasswd
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
# 域名配置
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上即可。

  proxy:
    image: nginx:1.11.5
    ......
    ports:
      - 8888:80
      - 443:443

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

realm: $ui_url:8888/service/token
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内修改。

上一篇下一篇

猜你喜欢

热点阅读