本文做者付廣平,UnitedStack有云存儲工程師,北京郵電大學碩士,從事大數據和雲計算相關工做,2016年畢業後加入UnitedStack大數據&容器組,負責Docker、Magnum和Sahara相關工做,Openstack、Docker社區活躍者。
做者別出心裁地使用Harbor搭建了私有Mirror服務,加速外部Docker鏡像的下載。編者對原文作了少許修改。
Harbor是VMware公司最近開源的企業級Docker Registry項目(https://github.com/vmware/harbor) 。其目標是幫助用戶迅速搭建一個企業級的Docker registry服務。它提供了管理UI, 基於角色的訪問控制(Role Based Access Control),AD/LDAP集成、以及審計日誌(Audit logging) 等企業用戶需求的功能,同時還原生支持中文。Harbor的每一個組件都是以Docker容器的形式構建的,使用Docker Compose來對它進行部署。
python
Harbor使用Docker-compose部署,後續全部的配置以及部署均在
$HARBOR_HOME/Deploy/
目錄下完成,所以若無特別說明,工做目錄都在該目錄下。
首先須要進行簡單的配置,配置文件爲harbor.cfg,配置項以下:
hostname:hostname爲外部可訪問的地址,即bind addr,一般設置爲本地公有IP,若內部使用DNS,可設置爲主機名。
auth_mode:Harbor支持兩種認證方式,默認爲本地存儲,即帳號信息存儲在mysql下,本文先使用本地存儲方式,另一種認證方式LDAP將在後續章節單獨介紹。
設置完畢後,配置文件爲:mysql
運行./prepare腳本更新配置。完成配置後,就可使用docker-compose快速部署Harbor:
docker-compose up -d
安裝完成後,訪問Web UI,地址:http://bind_addr,即配置的hostname地址,端口爲80。如圖:git
Web UI
安裝完成後,打開Web UI,點擊登陸,默認帳戶admin/Harbor12345,登陸成功後進入項目管理界面:用戶能夠點擊「個人項目」進行項目管理,好比新建項目、用戶以及權限管理等。點擊項目名稱,進入該項目下的鏡像管理界面,能夠查看、檢索鏡像。
Docker client
以上是UI界面的使用,接下來介紹如何使用docker client進行鏡像的管理,因爲Harbor只支持Registry V2 API,所以Docker client版本必須>= 1.6.0。
因爲咱們配置認證服務使用的是http,Docker認爲是不安全的,要使用咱們部署的鏡像倉庫,須要配置本地docker,修改配置文件(/etc/default/docker)爲:
DOCKER_OPTS="$DOCKER_OPTS --insecure-registry 42.62.x.x"
其中42.62.x.x是咱們部署Harbor的地址,即hostname配置項值。配置完後須要重啓docker服務。
驗證可否登陸:
docker login 42.62.x.x
登陸成功後顯示以下:github
接下來咱們上傳一個鏡像,以ubuntu鏡像爲例,首先從docker hub拉取ubuntu鏡像:
docker pull ubuntu:14.04
而後爲該鏡像打上新的標籤,標籤格式爲:Harbor地址/項目名/鏡像名稱:鏡像標籤,如:
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.04sql
push成功後,咱們就能夠從Harbor倉庫中使用docker pull拉取咱們的鏡像了,注意若是是私有項目,必須先使用docker login登陸:
docker pull 42.62.x.x/library/ubuntu:14.04
docker
Mirror是Docker Registry的一種特殊類型,它起到了相似代理服務器的緩存角色,在用戶和Docker Hub之間作Image的緩存。
其基本工做原理是,當用戶pull一個鏡像時,若鏡像在mirror 服務器存在,則直接從mirror服務器拉取,不然若不存在該鏡像,則由mirror server自動代理往dockerhub(可配置)中拉取鏡像,並緩存到mirror服務器中,當客戶再次拉取這個鏡像時,直接從mirror server中拉取,不須要再次從docker hub中拉取。
Harbor目前不支持pull cache功能,已提交Github issue #120。不過咱們只須要手動修改下配置便可完成,具體配置可查看官方Registry as a pull through cache.
咱們在運行./prepare以前修改config/registry/config.yml文件,追加如下配置:
proxy:
remoteurl: https://registry-1.docker.io
若是須要訪問私有倉庫,須要填寫Docker Hub的用戶名和密碼:
proxy:
remoteurl: https://registry-1.docker.io
username: [username]
password: [password]
而後從新啓動Harbor服務:ubuntu
docker-compose stop
docker-compose rm -f
docker-compose up -d
除了設置Harbor(或者registry),還須要配置本地docker服務,指定--registry-mirror參數,修改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服務才能生效。
Harbor因爲引進了認證功能,所以push操做時,必須保證project存在,好比push krystism/ffmpeg,必須保證Harbor建立了krystism project,不然會失敗。爲了可以正常push/pull dockerhub的官方鏡像,務必建立library project,如圖:緩存
假設本地不存在python鏡像:
咱們第一次pull python後,Harbor發現不存在該鏡像,因而本身做爲代理往Docker Hub里拉取,拉取後保存到本地,能夠經過Web UI查看。客戶端再次拉取python鏡像時,因爲Harbor已經存在該鏡像,所以不須要再往Docker Hub拉取,速度大幅度提升!
安全
Harbor支持兩種認證方式,默認爲本地存儲,即帳號信息存儲在mysql下,上文已經具體介紹。接下來介紹另一種認證方式LDAP,只須要修改配置文件便可。須要提供ldap url以及ldap basedn參數,而且設置auth_mode爲ldap_auth。
快速部署LDAP服務
爲了測試方便,咱們使用Docker啓動一個LDAP服務器,啓動腳本以下: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
建立新用戶,首先須要定義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
經過如下腳本建立新用戶,其中ldap_server爲LDAP服務容器名稱。
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
查看用戶是否建立成功:
docker exec ldap_server ldapsearch -x -h localhost \
-b dc=ustack,dc=com -D "cn=admin,dc=ustack,dc=com" \
-w admin_password
檢查test用戶是否存在,若存在,則說明建立成功,不然須要使用docker logs查看日誌。
配置Harbor使用LDAP認證
修改harbor.cfg文件關於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
Harbor項目:https://github.com/vmware/harbor
官方配置mirror registry文檔:https://github.com/docker/dist ... or.md
Daocloud關於mirror的博客:http://blog.daocloud.io/daocloud-mirror-free/
openLDAP部署:https://github.com/osixia/docker-openldap
歡迎廣大用戶使用Harbor項目並反饋意見和建議,也歡迎加入咱們貢獻代碼。若是您是Harbor的用戶或開發者,可申請加入Harbor開源項目微信羣,以方便溝通。請先掃描下面二維碼關注「亨利筆記」公衆號,並在公衆號後臺發送"入羣"信息便可。