為什么要搭建私有docker registry?
- 外網(wǎng)訪問(wèn)官方的registry速度很慢,而國(guó)內(nèi)的registry服務(wù)大多需要花錢循诉。私有registry免費(fèi),搭建之后撇他,能使內(nèi)網(wǎng)的主機(jī)加快訪問(wèn)速度茄猫,對(duì)CI,CD的效率有很大提升。
- 能有效保護(hù)內(nèi)部代碼困肩,防止放到公網(wǎng)泄漏出去划纽。
搭建及運(yùn)行registry:
拉取registry鏡像
docker pull registry:2
運(yùn)行registry
// 將registry的數(shù)據(jù)卷與本地關(guān)聯(lián),便于管理和備份registry數(shù)據(jù)
docker run -d -p 5000:5000 --name registry -v /mnt/docker/data/registry:/var/lib/registry registry:2
測(cè)試本地registry
// 首先為本地鏡像打tag
docker tag ubuntu localhost:5000/ubuntu
// 查看鏡像會(huì)發(fā)現(xiàn)多出一個(gè)鏡像:
[~]$ 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拉取剛才提交的鏡像
// 首先刪除剛才創(chuàng)建的鏡像
docker rmi localhost:5000/ubuntu
// 從registry拉取
docker pull localhost:5000/ubuntu
本地可以查看registry里包含的鏡像數(shù)據(jù)
// 進(jìn)入之前run registry時(shí)關(guān)聯(lián)的數(shù)據(jù)卷锌畸,發(fā)現(xiàn)里面已經(jīng)剛才push的ubuntu鏡像
[~]$ cd /mnt/docker/data/registry && ls docker/registry/v2/repositories/
ubuntu
//
配置外網(wǎng)可訪問(wèn)registry
外網(wǎng)訪問(wèn)registry需要使用https協(xié)議做安全認(rèn)證勇劣,不然docker pull/docker push
都會(huì)失敗。
下面是幾種配置方式潭枣。(操作系統(tǒng)均為centOS7)
方法一:配置參數(shù)--insecure-registry
這種方式最簡(jiǎn)單比默,但不安全。
配置docker客戶端盆犁,添加參數(shù)命咐,允許訪問(wèn)registry時(shí)候不適用https安全認(rèn)證。
vi /lib/systemd/system/docker.service
# 添加內(nèi)容
ExecStart=/usr/bin/dockerd --insecure-registry 192.168.100.9:5000
配置后重啟docker
方法二:配置https服務(wù)蚣抗。(推薦)侈百。
ssl證書(shū)瓮下,可以向CA機(jī)構(gòu)申請(qǐng)翰铡。也可以配置自簽名證書(shū)。
使用CA證書(shū)訪問(wèn)遠(yuǎn)程registry使用域名訪問(wèn)讽坏。步驟:
- 生成自認(rèn)證證書(shū):
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一項(xiàng)填寫域名**
Email Address []:
- 啟動(dòng)帶有認(rèn)證的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
將證書(shū)文件
certs/domain.crt
復(fù)制到docker客戶端的宿主機(jī)上/etc/docker/certs.d/mydockerhub.com:5000/ca.crt
锭魔;
注意!需要重啟docker daemon:systemctl restart docker
docker客戶端使用域名訪問(wèn)registry
docker push mydockerhub.com:5000/centos
- 如果域名mydockerhub.com尚未指向registry宿主機(jī)的ip地址路呜,可以修改hosts文件迷捧,將ip與域名做關(guān)聯(lián)。ip還配置局域網(wǎng)地址胀葱,這樣能加快上傳下載速度漠秋。
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服務(wù)器抵屿,將數(shù)據(jù)轉(zhuǎn)發(fā)給registry服務(wù)庆锦。這樣,registry服務(wù)就不用配置ssl了轧葛。
修改上面的2-5步搂抒。當(dāng)然如果購(gòu)買CA認(rèn)證證書(shū)艇搀,可以不用自己生成的證書(shū),這樣連第一步也不需要了求晶。
- 配置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客戶端訪問(wèn)registry
docker push registry.yourhost.com/centos
- 如果需要鑒權(quán)焰雕,在nginx.conf中配置訪問(wèn)權(quán)限
auth_basic "Registry realm";
auth_basic_user_file /mnt/htpasswd/registry.htpasswd;
生成賬號(hào)密碼的命令:
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服務(wù)。
Harbor是vmware公司開(kāi)源的用于企業(yè)級(jí)docker registry服務(wù)芳杏。它提供了web-ui界面矩屁,角色管理,LDAP支持蚜锨,restful API等功能档插,項(xiàng)目地址:https://github.com/vmware/harbor。
我們可以搭建Harbor來(lái)代替docker registry亚再。安裝的過(guò)程參考: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
配置
具體的字段含義安裝文檔氛悬,我只修改以少部分字段则剃,其他的都是用的默認(rèn)值。
# 域名配置
hostname = registry.youhost.com
# 騰訊企業(yè)郵箱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
文件內(nèi)有個(gè)ui_url_protocol
字段如捅,意思是棍现,使用http還是https協(xié)議訪問(wèn)UI。
docker的registry在遠(yuǎn)程訪問(wèn)時(shí)必須使用https協(xié)議(除非加上參數(shù)--insecure-registry
镜遣, 不建議)己肮。
但這個(gè)字段可以就使用默認(rèn)值(http),然后通過(guò)服務(wù)器上的nginx監(jiān)聽(tīng)https悲关,做端口轉(zhuǎn)發(fā)到harbor的nginx上即可谎僻。
- 修改
docker-compose.yml
文件
由于我們?cè)诜?wù)器上已經(jīng)配置了nginx,所以需要修改harbor的nginx服務(wù)的默認(rèn)監(jiān)聽(tīng)端口80寓辱,改成8888艘绍。
proxy:
image: nginx:1.11.5
......
ports:
- 8888:80
- 443:443
修改所有mount的文件路徑,默認(rèn)是在/data下秫筏,這步可選诱鞠。
- 修改
common/templates/registry/config.yml
文件,在ui_url后面添加端口號(hào)8888:
realm: $ui_url:8888/service/token
- 配置服務(wù)器端的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;
}
}
- 啟動(dòng)服務(wù)
./install.sh
至此这敬,一個(gè)harbor服務(wù)就搭建完成了航夺。在瀏覽器內(nèi)訪問(wèn)UI頁(yè)面:
默認(rèn)賬號(hào)/密碼:admin/Harbor12345 〈尥浚可以在harbor.cfg內(nèi)修改阳掐。