为什么要搭建私有docker registry?
- 外网访问官方的registry速度很慢,而国内的registry服务大多需要花钱。私有registry免费,搭建之后,能使内网的主机加快访问速度,对CI,CD的效率有很大提升。
- 能有效保护内部代码,防止放到公网泄漏出去。
搭建及运行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使用域名访问。步骤:
- 生成自认证证书:
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 []:
- 启动带有认证的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
将证书文件
certs/domain.crt
复制到docker客户端的宿主机上/etc/docker/certs.d/mydockerhub.com:5000/ca.crt
;
注意!需要重启docker daemon:systemctl restart docker
docker客户端使用域名访问registry
docker push mydockerhub.com:5000/centos
- 如果域名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页面:
默认账号/密码:admin/Harbor12345 。可以在harbor.cfg内修改。