題圖攝於舊金山
本文作者付廣平,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來對它進行部署。
Harbor使用Docker-compose部署,後續所有的配置以及部署均在
$HARBOR_HOME/Deploy/
目錄下完成,因此若無特別說明,工作目錄都在該目錄下。
首先需要進行簡單的配置,配置文件為harbor.cfg,配置項如下:
設置完畢後,配置文件為:
運行./prepare腳本更新配置。完成配置後,就可以使用docker-compose快速部署Harbor:
docker-compose up -d
安裝完成後,訪問Web UI,地址:http://bind_addr,即配置的hostname地址,埠為80。如圖:
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
登錄成功後顯示如下:接下來我們上傳一個鏡像,以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.04
push成功後,我們就可以從Harbor倉庫中使用docker pull拉取我們的鏡像了,注意如果是私有項目,必須先使用docker login登錄:
docker pull 42.62.x.x/library/ubuntu:14.04
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服務:
# 注意不要執行./prepare
docker-compose stopdocker-compose rm -fdocker-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。
為了測試方便,我們使用Docker啟動一個LDAP伺服器,啟動腳本如下:
#!/bin/bash
NAME=ldap_serverdocker rm -f $NAME 2>/dev/nulldocker 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:
./preparedocker-compose stopdocker-compose rm -fdocker-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/distribution/blob/master/docs/mirror.md
Daocloud關於mirror的博客:http://blog.daocloud.io/daocloud-mirror-free/
openLDAP部署:https://github.com/osixia/docker-openldap
歡迎大家使用Harbor Registry和反饋意見,可到GitHub上的Issues區和我們互動。也可以關注公眾號:「亨利筆記」,在後臺發信息"入群",加入Harbor開源項目用戶群交流。
長按二維碼關注
亨利筆記