使用Harbor構(gòu)建私有Docker鏡像倉庫
簡介
Harbor是VMware公司最近開源的企業(yè)級Docker Registry項目, 項目地址為https://github.com/vmware/harbor 其目標是幫助用戶迅速搭建一個企業(yè)級的Docker registry服務(wù)。它以Docker公司開源的registry為基礎(chǔ),提供了管理UI, 基于角色的訪問控制(Role Based Access Control),AD/LDAP集成、以及審計日志(Audit logging) 等企業(yè)用戶需求的功能,同時還原生支持中文。Harbor的每個組件都是以Docker容器的形式構(gòu)建的,使用Docker Compose來對它進行部署。用于部署Harbor的Docker Compose模板位于 /Deployer/docker-compose.yml,由5個容器組成:
- Proxy: 由Nginx 服務(wù)器構(gòu)成的反向代理。
- Registry:由Docker官方的開源registry 鏡像構(gòu)成的容器實例。
- UI: 即架構(gòu)中的core services, 構(gòu)成此容器的代碼是Harbor項目的主體。
- Mysql: 由官方MySql鏡像構(gòu)成的數(shù)據(jù)庫容器。
- Log: 運行著rsyslogd的容器,通過log-driver的形式收集其他容器的日志。
這幾個容器通過Docker link的形式連接在一起,在容器之間通過容器名字互相訪問。對終端用戶而言,只需要暴露proxy (即Nginx)的服務(wù)端口。
快速部署方法
Harbor使用Docker-compose部署,后續(xù)所有的配置以及部署均在$HARBOR_HOME/Deploy/`目錄下完成,因此若無特別說明,工作目錄都在該目錄下。
首先需要進行簡單的配置,配置文件為harbor.cfg,配置項如下:
- hostname:hostname為外部可訪問的地址,即bind addr,通常設(shè)置為本地公有IP,若內(nèi)部使用DNS,可設(shè)置為主機名。
- auth_mode:Harbor支持兩種認證方式,默認為本地存儲,即賬號信息存儲在mysql下,本文先使用本地存儲方式,另外一種認證方式LDAP將在后續(xù)章節(jié)單獨介紹。
設(shè)置完畢后,配置文件為:
- hostname = 42.62.x.x
- ui_url_protocol = http
- #email_server = smtp.mydomain.com
- #email_server_port = 25
- #email_username = sample_admin@mydomain.com
- #email_password = abc
- #email_from = admin <sample_admin@mydomain.com>
- ##The password of Harbor admin, change this before any production use.
- harbor_admin_password= admin
- ##By default the auth mode is db_auth, i.e. the credentials are stored in a local database.
- #Set it to ldap_auth if you want to verify a user credentials against an LDAP server.
- auth_mode = ldap_auth
- #The password for the root user of mysql db, change this before any production use.
- db_password = root123
- #Switch for self-registration feature
- self_registration = on
運行./prepare腳本更新配置。完成配置后,就可以使用docker-compose快速部署harbor:
- docker-compose up -d
安裝完成后,訪問Web UI,地址:http://bind_addr,即配置的hostname地址,端口為80。如圖:
使用harbor
Web UI
安裝完成后,打開Web UI,點擊登錄,默認賬戶admin/Harbor12345,登錄成功后進入項目管理界面:
用戶可以點擊“我的項目”進行項目管理,比如新建項目、用戶以及權(quán)限管理等。點擊項目名稱,進入該項目下的鏡像管理界面,可以查看、檢索鏡像。
docker client
以上是UI界面的使用,接下來介紹如何使用docker client進行鏡像的管理,由于harbor只支持Registry V2 API,因此Docker client版本必須>= 1.6.0。
由于我們配置認證服務(wù)使用的是http,Docker認為是不安全的,要使用我們部署的鏡像倉庫,需要配置本地docker,修改配置文件(/etc/default/docker)為:
- DOCKER_OPTS="$DOCKER_OPTS --insecure-registry 42.62.x.x"
其中42.62.x.x是我們部署Harbor的地址,即hostname配置項值。配置完后需要重啟docker服務(wù)。
驗證能否登錄:
- docker login 42.62.x.x
- # docker login -u admin -p Harbor12345 -e test@gmail.com 42.62.x.x
登錄成功后顯示如下:
接下來我們上傳一個鏡像,以ubuntu鏡像為例,首先從docker hub拉取ubuntu鏡像:
- docker pull ubuntu:14.04
然后為該鏡像打上新的標簽,標簽格式為:Harbor地址/項目名/鏡像名稱:鏡像標簽,如42.62.x.x/library/ubuntu:14.04:
- docker tag ubuntu:14.04 42.62.x.x/library/ubuntu:14.04
push我們的鏡像到harbor倉庫中:
- docker push ubuntu:14.04 42.62.x.x/library/ubuntu:14.04
push成功后,我們就可以從harbor倉庫中使用docker pull拉取我們的鏡像了,注意如果是私有項目,必須先使用docker login登錄:
- docker pull 42.62.x.x/library/ubuntu:14.04
使用harbor作為mirror registry
Mirror Registry簡介
Mirror是Docker Registry的一種特殊類型,它起到了類似代理服務(wù)器的緩存角色,在用戶和Docker Hub之間做Image的緩存。 官方定義為:
Such a registry is provided by a third-party hosting infrastructure but is targeted at their customers only. Some mechanism ensures that public images are pulled from a sponsor registry to the mirror registry, to make sure that the customers of the third-party provider can docker pull those images locally.
其基本工作原理是,當用戶pull一個鏡像時,若鏡像在mirror 服務(wù)器存在,則直接從mirror服務(wù)器拉取,否則若不存在該鏡像,則由mirror server自動代理往dockerhub(可配置)中拉取鏡像,并緩存到mirror服務(wù)器中,當客戶再次拉取這個鏡像時,直接從mirror server中拉取,不需要再次從dockerhub中拉取。
注意Mirror跟Private Registry有本質(zhì)區(qū)別
Private Registry是開發(fā)者或者企業(yè)自建的Image存儲庫,通常用來保存企業(yè)內(nèi)部的Docker Image,用于內(nèi)部開發(fā)流程和產(chǎn)品的發(fā)布、版本控制。Mirror是一種代理中轉(zhuǎn)服務(wù),我們提供的Mirror服務(wù),直接對接Docker Hub的官方Registry,Docker Hub上有數(shù)以十萬計的各類Docker Image。在使用Private Registry時,需要在Docker Pull,或Dockerfile中直接鍵入Private Registry的地址,通常這樣會導(dǎo)致跟Private Registry的綁定,缺少靈活性。
原理如圖:
Harbor目前不支持pull cache功能,已提交issue #120。不過我們只需要手動修改下配置即可完成,具體配置可參考官方Registry as a pull through cache.
我們在運行./prepare之前修改config/registry/config.yml文件,追加以下配置:
- proxy:
- remoteurl: https://registry-1.docker.io
如果需要訪問私有倉庫,需要填寫dockerhub的用戶名和密碼:
- proxy:
- remoteurl: https://registry-1.docker.io
- username: [username]
- password: [password]
然后重新啟動harbor服務(wù):
- # 注意不要執(zhí)行./prepare
- docker-compose stop
- docker-compose rm -f
- docker-compose up -d
除了設(shè)置harbor(或者registry),還需要配置本地docker服務(wù),指定--registry-mirror參數(shù),修改docker配置文件(/etc/default/docker):
- DOCKER_OPTS="$DOCKER_OPTS --registry-mirror=http://42.62.x.x --insecure-registry 42.62.x.x"
注意替換42.62.x.x為你的registry地址。
注意:修改了docker配置文件,必須重啟docker服務(wù)才能生效。
harbor由于引進了認證功能,因此push操作時,必須保證project存在,比如push krystism/ffmpeg,必須保證harbor創(chuàng)建了krystism project,否則會失敗。為了能夠正常push/pull dockerhub的官方鏡像,務(wù)必創(chuàng)建library project,如圖:
假設(shè)本地不存在python鏡像:
- docker pull python # pull from dockerhub
- docker rmi python # remove the image
- docker pull python # yes, it will pull from harbor now
我們***次pull python后,harbor發(fā)現(xiàn)不存在該鏡像,于是自己作為代理往dockerhub里拉取,拉取后保存到本地,可以通過WebUI查看??蛻舳嗽俅卫ython鏡像時,由于harbor已經(jīng)存在該鏡像,因此不需要再往dockerhub拉取,速度大幅度提高!
對接LDAP認證
Harbor支持兩種認證方式,默認為本地存儲,即賬號信息存儲在mysql下,上文已經(jīng)具體介紹。接下來介紹另外一種認證方式LDAP,只需要修改配置文件即可。需要提供ldap url以及l(fā)dap basedn參數(shù),并且設(shè)置auth_mode為ldap_auth。
快速部署LDAP服務(wù)
為了測試方便,我們使用docker啟動一個LDAP服務(wù)器,啟動腳本如下:
- #!/bin/bash
- NAME=ldap_server
- docker rm -f $NAME 2>/dev/null
- docker run --env LDAP_ORGANISATION="Unitedstack Inc." --env LDAP_DOMAIN="ustack.com" \
- --env LDAP_ADMIN_PASSWORD="admin_password" -v `pwd`/containers/openldap/data:/var/lib/ldap -v `pwd`/containers/openldap/slapd.d:/etc/ldap/slapd.d --detach --name $NAME osixia/openldap:1.1.2
創(chuàng)建新用戶,首先需要定義ldif文件,new_user.ldif:
- dn: uid=test,dc=ustack,dc=com
- uid: test
- cn: test
- sn: 3
- objectClass: top
- objectClass: posixAccount
- objectClass: inetOrgPerson
- loginShell: /bin/bash
- homeDirectory: /home/test
- uidNumber: 1001
- gidNumber: 1001
- userPassword: 1q2w3e4r
- mail: test@example.com
- gecos: test
通過以下腳本創(chuàng)建新用戶,其中l(wèi)dap_server為LDAP服務(wù)容器名稱。
- docker cp new_user.ldif ldap_server:/
- docker exec ldap_server ldapadd -x -D "cn=admin,dc=ustack,dc=com" -w admin_password -f /new_user.ldif -ZZ
查看用戶是否創(chuàng)建成功:
- docker exec ldap_server ldapsearch -x -h localhost -b dc=ustack,dc=com -D "cn=admin,dc=ustack,dc=com" -w admin_password
檢查test用戶是否存在,若存在,則說明創(chuàng)建成功,否則需要使用docker logs查看日志。
配置harbor使用LDAP認證
修改harbor.cfg文件關(guān)于LDAP配置項,如下:
- auth_mode = ldap_auth
- ldap_url = ldap://42.62.x.x
- ldap_basedn = uid=%s,dc=ustack,dc=com
然后重新部署harbor:
- ./prepare
- docker-compose stop
- docker-compose rm -f
- docker-compose up -d
測試是否能夠使用test用戶登錄:
- docker login -u test -p 1q2w3e4r -e test@example.com 42.62.x.x
查看結(jié)果。
【本文是51CTO專欄作者“付廣平”的原創(chuàng)文章,如需轉(zhuǎn)載請通過51CTO獲得聯(lián)系】