前一段時間看了glusterfs分布式檔案系統,從14年開始一直關注docker,現在導師讓結合分布式檔案系統和docker的鏡像存儲做些工作,并且推薦了京東的speedy,這兩天一直在實驗室叢集上安裝speedy,因為網上關于這方面的資料特别少,是以将安裝過程記下來與大家分析。
首先,介紹一下環境,我用了三台伺服器,分别為node01、node02、node03,并且是在root使用者下操作的,在上篇文章搭建好的go語言開發環境的基礎上,以下操作均是在此條件下進行的,即使用者已經設定好了GOPATH和GOROOT變量,此文GOPATH為/home/go/goprojects,GOROOT為/usr/local/go,請參考者換成自己相對應的目錄。
第一步,下載下傳安裝需要的包并且放入正确目錄。
用的ubuntu14.04,首先安裝docker_registry的依賴包python-pip,python-dev,liblzma-dev
從https://github.com/jcloudpub/speedy下載下傳speedy解壓到/home/go/goprojects/src/github.com/jcloudpub
從https://github.com/gorilla/context下載下傳context、從https://github.com/gorilla/mux下載下傳mux解壓到/home/go/goprojects/src/github.com/gorilla
從https://github.com/garyburd/redigo下載下傳redigo解壓到/home/go/goprojects/src/github.com/garyburd
從https://github.com/go-sql-driver/mysql下載下傳mysql解壓到/home/go/goprojects/src/github.com/go-sql-driver
第二步,進入speedy目錄,執行make指令,編譯程式
第三步,如果機器上沒有安裝mysql,安裝上
第四步,假設mysql的使用者名和密碼都是root,建立speedy和metadb資料庫,具體指令為 mysql -uroot -proot < docs/speedy.sql
第五步,我是用的node01當作chunkmaster主控端,ip位址為10.107.18.31,node01、node02、node03上各安裝一組chunkserver。在node01上啟動chunkmaster,這一步要注意,因為speedy原程式假設mysql的root使用者沒有密碼,是以我們要先改源代碼将root使用者的密碼也改為root。具體方法如下所示:
打開cmd/chunkmaster/main.go,找到第23行,将flag.string()第二個參數的空字元串加上root,儲存後退出。之後重新編譯該檔案,生成chunkmaster替換bin檔案中原來的chunkmaster。到此,更改完畢,運作chunkmaster,指令為bin/chunkmaster
第六步,建立描述chunkserver資訊的檔案serverlist.json,檔案的内容為
node01:
[
{"GroupId":1,"Ip":"127.0.0.1","Port":7654},
{"GroupId":1,"Ip":"127.0.0.1","Port":7655},
{"GroupId":1,"Ip":"127.0.0.1","Port":7656}
]
node02:
[
{"GroupId":2,"Ip":"10.107.18.31","Port":7664},
{"GroupId":2,"Ip":"10.107.18.31","Port":7665},
{"GroupId":2,"Ip":"10.107.18.31","Port":7666}
]
node03:
[
{"GroupId":3,"Ip":"10.107.18.31","Port":7674},
{"GroupId":3,"Ip":"10.107.18.31","Port":7675},
{"GroupId":3,"Ip":"10.107.18.31","Port":7676}
]
檔案建好後,在三台機器上分别運作指令curl -i -X POST --data @serverlist.json "http://10.107.18.31:8099/v1/chunkserver/batchinitserver",将chunkserver資訊傳送給chunkmaster
第七步,基于以上的設定運作chunkserver,在三台機器上分别運作
node01:
./bin/spy_server --ip=10.107.18.31 --port=7654 --data_dir=~/spy_data --error_log=./err.log --group_id=1 --master_port=8099 --master_ip=10.107.18.31
./bin/spy_server --ip=10.107.18.31 --port=7655 --data_dir=~/spy_data --error_log=./err.log --group_id=1 --master_port=8099 --master_ip=10.107.18.31
./bin/spy_server --ip=10.107.18.31 --port=7656 --data_dir=~/spy_data --error_log=./err.log --group_id=1 --master_port=8099 --master_ip=10.107.18.31
node02:
./bin/spy_server --ip=10.107.18.32 --port=7664 --data_dir=~/spy_data --error_log=./err.log --group_id=2 --master_port=8099 --master_ip=10.107.18.31
./bin/spy_server --ip=10.107.18.32 --port=7665 --data_dir=~/spy_data --error_log=./err.log --group_id=2 --master_port=8099 --master_ip=10.107.18.31
./bin/spy_server --ip=10.107.18.32 --port=7666 --data_dir=~/spy_data --error_log=./err.log --group_id=2 --master_port=8099 --master_ip=10.107.18.31
node03:
./bin/spy_server --ip=10.107.18.33 --port=7674 --data_dir=~/spy_data --error_log=./err.log --group_id=3 --master_port=8099 --master_ip=10.107.18.31
./bin/spy_server --ip=10.107.18.33 --port=7675 --data_dir=~/spy_data --error_log=./err.log --group_id=3 --master_port=8099 --master_ip=10.107.18.31
./bin/spy_server --ip=10.107.18.33 --port=7676 --data_dir=~/spy_data --error_log=./err.log --group_id=3 --master_port=8099 --master_ip=10.107.18.31
第八步,同第五步原因,打開cmd/imageserver/main.go,找到第23行,将flag.string()第二個參數的空字元串加上root,儲存後退出。之後重新編譯該檔案,生成 imageserver替換bin檔案中原來的imageserver。運作imageserver,bin/imagerserver
至此,speedy已經搭建成功。
再向下就是在該speedy的基礎上安裝docker_registry
第一步,安裝docker_registry相關包
首先,mkdir /home/docker/registry建立放檔案的目錄
然後,執行tar -xzvf ./docker_registry/docker-registry-core-2.0.3.tar.gz和tar -xzvf ./docker_registry/docker-registry-0.9.0.tar.gz分别解壓docker-registry-core-2.0.3和docker-registry-0.9.0,将這兩個解壓好的包轉移到/home/docker/registry,同時将docker_registry_speedy_driver轉移到/home/docker/registry
第二步,安裝docker-registry-core-2.0.3和docker-registry-0.9.0
cd /home/docker/registry/docker-registry-core-2.0.3
python setup.py install
cd /home/docker/registry/docker-registry-0.9.0
python setup.py install
第三步,安裝speedy_docker_registry_driver
cd speedy_docker_registry_driver
python setup.py install
第四步,更改registry的設定檔案 cd /home/docker/registry/docker_registry_speedy_driver/ cp config_sample.yml config.yml,将config.yml中的speedy選項中的storage_urls:改為_env:SPEEDY_STORAGE:http://127.0.0.1:6788 在該目錄下建立dev.env檔案,檔案内容如下: export GUNICORN_WORKERS=16
export SETTINGS_FLAVOR=speedy
export SPEEDY_TMPDIR=/home/docker /registry/temp
export DOCKER_REGISTRY_CONFIG=/home/docker/registry/docker_registry_speedy_driver/config .yml 執行指令 . ./dev.env設定環境變量 第五步,啟動docker_registry 執行/usr/local/bin/docker-registry,啟動完成後,上傳鏡像時,如果報Error: Invalid Registry endpoint: This does not look like a Registry server ("X-Docker-Registry-Version" header not found in the response)錯誤,證明docker版本太低,要用1.0以上的穩定版本; 換成新版本後錯誤就變成了Error response from daemon: v1 ping attempt failed with error: Get https://node01:5000/v1/_ping: EOF. If this private registry supports only HTTP or HTTPS with an unknown CA certificate, please add `--insecure-registry node01:5000` to the daemon's arguments. In the case of HTTPS, if you have access to the registry's CA certificate, no need for the flag; simply place the CA certificate at /etc/docker/certs.d/node01:5000/ca.crt 。簡單的解決方法是 1. 在要上傳鏡像的機器上執行 service docker stop先關掉docker daemon 2.在要上傳鏡像的機器上 /usr/bin/docker -d --insecure-registry node01:5000,node01為該機器主機名 可以執行push操作了,比如docker push node01:5000/ubuntu:latest