搭建私有docker registry

為什么要搭建私有docker registry?

  1. 外網(wǎng)訪問(wèn)官方的registry速度很慢,而國(guó)內(nèi)的registry服務(wù)大多需要花錢循诉。私有registry免費(fèi),搭建之后撇他,能使內(nèi)網(wǎng)的主機(jī)加快訪問(wèn)速度茄猫,對(duì)CI,CD的效率有很大提升。
  2. 能有效保護(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)讽坏。步驟:

  1. 生成自認(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 []:
  1. 啟動(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
  1. 將證書(shū)文件certs/domain.crt復(fù)制到docker客戶端的宿主機(jī)上/etc/docker/certs.d/mydockerhub.com:5000/ca.crt锭魔;
    注意!需要重啟docker daemon: systemctl restart docker

  2. docker客戶端使用域名訪問(wèn)registry

docker push mydockerhub.com:5000/centos
  1. 如果域名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è)面:

harbor.png

默認(rèn)賬號(hào)/密碼:admin/Harbor12345 〈尥浚可以在harbor.cfg內(nèi)修改阳掐。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子锚烦,更是在濱河造成了極大的恐慌觅闽,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件涮俄,死亡現(xiàn)場(chǎng)離奇詭異蛉拙,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)彻亲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門孕锄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人苞尝,你說(shuō)我怎么就攤上這事畸肆。” “怎么了宙址?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵轴脐,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我抡砂,道長(zhǎng)大咱,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任注益,我火速辦了婚禮碴巾,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘丑搔。我一直安慰自己厦瓢,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布啤月。 她就那樣靜靜地躺著煮仇,像睡著了一般。 火紅的嫁衣襯著肌膚如雪顽冶。 梳的紋絲不亂的頭發(fā)上欺抗,一...
    開(kāi)封第一講書(shū)人閱讀 49,166評(píng)論 1 284
  • 那天售碳,我揣著相機(jī)與錄音强重,去河邊找鬼。 笑死贸人,一個(gè)胖子當(dāng)著我的面吹牛间景,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播艺智,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼倘要,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起封拧,我...
    開(kāi)封第一講書(shū)人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤志鹃,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后泽西,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體曹铃,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年捧杉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了陕见。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡味抖,死狀恐怖评甜,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情仔涩,我是刑警寧澤忍坷,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站熔脂,受9級(jí)特大地震影響承匣,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜锤悄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一韧骗、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧零聚,春花似錦袍暴、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至蚂会,卻和暖如春淋样,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背胁住。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工趁猴, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人彪见。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓儡司,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親余指。 傳聞我的和親對(duì)象是個(gè)殘疾皇子捕犬,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容