012-P2P加速Docker鏡像分發(阿里Dragonfly)

這是堅持技術寫做計劃(含翻譯)的第12篇,定個小目標999,每週最少2篇。php

吐槽一下,最近有點懶,竟然欠了4篇,後續會慢慢補上。html

介紹

若是說,微服務和容器是最佳拍檔,那麼模塊多實例是確定少不了。
假如沒有使用相似 Google jib 等手段進行鏡像分層(利用鏡像緩存),勢必會形成前端

  • 帶寬浪費:尤爲是公網帶寬,若是是自建harbor,那麼會容易致使單節點網卡被打滿,若是用了harbor聯邦,又會致使數據同步等運維問題。
  • 集羣拉起慢:鏡像下載慢,必然會致使服務拉起慢。

關於Google jib能夠參見我另一篇 加速和簡化構建Docker(基於Google jib) ,本文只介紹 Dragonfly + dfdaemonnode

Dragonfly是阿里巴巴自研並開源的一款基於P2P協議的文件分發系統。除了使用 dfget 進行文件下載外,還支持dfdaemon 進行docker鏡像下載。git

關於Dragonfly的鏡像分發的原理性說明,可參見 直擊阿里雙11神祕技術:PB級大規模文件分發系統「蜻蜓」 ,文中介紹很詳細,此處很少說明。程序員

google jib 和 Dragonfly 系列文章github

實驗環境

類型 系統 ip docker version
supernode Ubuntu Server 16.04.6 LTS X64 192.168.0.44 17.06.2~ce-0~ubuntu
clinet1 Ubuntu Server 16.04.6 LTS X64 192.168.0.40 17.06.2~ce-0~ubuntu
clinet2 Ubuntu Server 16.04.6 LTS X64 192.168.0.45 17.06.2~ce-0~ubuntu

注意: 
若是是實驗目的,建議用Vmware,而且在關鍵操做時備份快照(好比,剛裝完環境),這樣可以及時,乾淨的還原現場,節省每次重裝系統致使的時間浪費docker

安裝json

吐槽一下Dragonfly的文檔,簡直讓人不知因此。結合issues + 釘釘羣內請教,遂整理出最簡使用文檔。 ubuntu

supernode

可選:給supernode增長docker加速器,能夠參考 cr.console.aliyun.com/cn-hangzhou… ,若是不須要,能夠去掉。

$ cat <<EOD >/etc/docker/daemon.json
{
"registry-mirrors": ["https://xxxx.mirror.aliyuncs.com"] 
}
EOD
$ systemctl restart docker 
複製代碼
$ docker run --name dragonfly-supernode --restart=always -d -p 8001:8001 -p 8002:8002 -v /data/dragonfly/supernode:/home/admin/supernode registry.cn-hangzhou.aliyuncs.com/dragonflyoss/supernode:0.3.0 -Dsupernode.advertiseIp=192.168.0.44
複製代碼

說明:

  • --restart=always 在容器退出時,自動重啓容器,防止異常kill或者oom致使的異常退出
  • registry.cn-hangzhou.aliyuncs.com/dragonflyoss/supernode:0.3.0 dragonfly的supernode目前沒有docker hub鏡像,只能用阿里雲的
  • -v /data/dragonfly/supernode:/home/admin/supernode 將supernode的data dir掛載到宿主機上
  • -Dsupernode.advertiseIp=192.168.0.44 設置clinet能夠訪問的supernode ip,這是一個大坑。若是不設置,有可能會致使client沒法鏈接supernode,屆時,docker pull會走clinet的網絡,從真實的registry直接下載鏡像

image.png

dfdaemon

$ cat <<EOD >/etc/dragonfly.conf
[node]
address=192.168.0.44
EOD
$ docker run --name dragonfly-dfclient --restart=always -d -p 65001:65001 -v /root/.small-dragonfly:/root/.small-dragonfly -v /etc/dragonfly.conf:/etc/dragonfly.conf dragonflyoss/dfclient:v0.3.0 --registry=https://xxx.mirror.aliyuncs.com  --ratelimit 100M
$ cat <<EOD >/etc/docker/daemon.json
{
"registry-mirrors": ["http://127.0.0.1:65001"]
}
EOD
$ systemctl restart docker 
複製代碼

說明:

  • 在 /etc/dragonfly.conf 中配置client能夠訪問的supernode的ip地址,可是,目前官方沒有作HA,supernode無法組集羣,撐死算是聯邦,不能共享文件信息,並且最坑的是,快速開始裏,中英文均未提供須要配置此文件,而是在 Downloading Files with Dragonfly 等有所說起(我都是被坑完後,用關鍵詞在d7y的org裏搜索,相似知道答案後,找出處 手動[捂臉])
  • -v /root/.small-dragonfly:/root/.small-dragonfly ,將容器中的關鍵目錄掛載到宿主機上,防止重啓或者鏡像升級時,數據丟失
  • --registry=https://xxx.mirror.aliyuncs.com 從何處下載鏡像,能夠寫harbor地址,也能夠寫加速器地址。默認是 index.docker.io ,可是,由於國內網絡緣由,會致使大機率性失敗。很靈異。而官方文檔是寫的 --registry https://xxx.xx.x 不能算是坑,可是,對於docker不熟悉的,每每會不知能不能用加速器。
  • --ratelimit 100M 是限速,默認是20M ,這確定不算坑哈,這是正常特性,在  dfdaemon#Options 有說明,可是,文檔是有誤的 -ratelimit 而實際是 --ratelimit ,若是不改此參數,會發現,下載很慢。
  • 修改/etc/docker/daemon.json 是爲了讓docker engine走 dfdaemon
  • systemctl restart docker 是爲了讓daemon生效

測試

大文件測試

$ docker pull anjia0532/kubeflow-images-public.tensorflow-1.6.0-notebook-gpu:v20180604-b3733835
複製代碼

能夠經過 iftop 等軟件,查看帶寬使用狀況判斷是否生效,也能夠經過查看日誌來判斷。

image.png

可是會常常性的出現 error pulling image configuration: received unexpected HTTP status: 502 Bad Gateway

最後

須要結合實際狀況,配置相關參數,好比,文件失效時間,用來平衡文件有效期及磁盤使用量。

參考資料

招聘小廣告

山東濟南的小夥伴歡迎投簡歷啊 加入咱們 , 一塊兒搞事情。

長期招聘,Java程序員,大數據工程師,運維工程師,前端工程師。

相關文章
相關標籤/搜索