Docker學(xué)習(xí)筆記之四,構(gòu)建一個Redis as a Service(RAAS)
Docker的抽象
若把一臺Linxu機器比喻為一艘船,那么每一個Linux Container就好比船上的一個集裝箱。
另外一個層面,Docker Image(鏡像)就是一個預(yù)先定義行為的模板,Docker Container(容器)是鏡像模板運行時的狀態(tài)。一個鏡像模板,可以對應(yīng)N個容器實例運行時。 Docker號稱,(鏡像)一處構(gòu)建,到處運行(Container),這不是當(dāng)初Java的口號嘛!無論是工作機,還是線上服務(wù)器,
一個具體的Docker鏡像就好比一張畫板,你在上面畫什么,你們就會形成新的模板,可以循環(huán)利用。
Docker可用于測試,可用于沙箱隔離,可用于運行桌面,可用于作為數(shù)據(jù)/Web服務(wù)存在,總之作為一個較為完整的抽象的技術(shù)堆棧模板,好比打開了一扇窗,給予了人們?nèi)舾煞N可能性,無限的想象空間。
構(gòu)建一個Redis as a Service鏡像
設(shè)定企業(yè)內(nèi)部,每一個系統(tǒng)都需要獨享Redis緩存服務(wù),這不就是SAAS軟件即服務(wù)的適用場景嘛,若基于Docker上構(gòu)建,那是相當(dāng)?shù)暮唵?。使用Docker腳本構(gòu)建Redis服務(wù)鏡像模板,那是相當(dāng)?shù)暮唵危?/p>
redis.dockerfile:
FROM ubuntu:12.10
RUN apt-get update
RUN apt-get -y install redis-server
EXPOSE 6379
ENTRYPOINT ["/usr/bin/redis-server"]
接著構(gòu)建鏡像:
docker build -t yongboy/redis -< redis.dockerfile
當(dāng)然,你可以使用dns服務(wù)來通過內(nèi)部域名進(jìn)行路由定位,這里簡略。
運行時設(shè)置某一個Redis Server具體實例:
docker run -name redis1_server -d -p 192.168.190.133:7001:6379 -m 1g yongboy/redis
這里指定當(dāng)前運行的實例名稱為redis1_server,分配1G內(nèi)存,以后臺進(jìn)程服務(wù)方式運行,同時端口映射到宿主機持有第二個IP地址192.168.190.133和端口7001上。執(zhí)行上面命令,會收到當(dāng)前內(nèi)核不支持交換分區(qū)的警告信息,這里直接無視好了:
WARNING: Your kernel does not support memory swap capabilities. Limitation discarded.
在宿主技術(shù)上安裝redis客戶端,測試一下,確認(rèn)可以連接到redis1_server服務(wù)器上:
telnet 192.168.190.133 7001
Trying 192.168.190.133...
Connected to 192.168.190.133.
Escape character is '^]'.
set docker awesome
+OK
get docker
$7
awesome
get redis
$-1
redis1_server在運行中,輸入 ctrl + ],輸入q退出telnet。
運行更多的Redis鏡像實例:
docker run -name redis2_server -d -p 192.168.190.133:7002:6379 -m 1g yongboy/redis
docker run -name redis3_server -d -p 192.168.190.133:7003:6379 -m 1g yongboy/redis
docker run -name redis4_server -d -p 192.168.190.133:7004:6379 -m 1g yongboy/redis
docker run -name redis5_server -d -p 192.168.190.133:7005:6379 -m 1g yongboy/redis
宿主機只有4G內(nèi)存,那么每一個Redis Sever都會自動分配1G內(nèi)存,運行5個實例,出現(xiàn)了資源超售現(xiàn)象:
yongboy@localhost:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9b9d3f5fceb8 yongboy/redis:latest /usr/bin/redis-serve 2 seconds ago Up 1 seconds 192.168.190.133:7005->6379/tcp redis5_server
caf413606999 yongboy/redis:latest /usr/bin/redis-serve 4 seconds ago Up 3 seconds 192.168.190.133:7004->6379/tcp redis4_server
76566b33469a yongboy/redis:latest /usr/bin/redis-serve 4 seconds ago Up 4 seconds 192.168.190.133:7003->6379/tcp redis3_server
4e24a529c5fc yongboy/redis:latest /usr/bin/redis-serve 4 seconds ago Up 4 seconds 192.168.190.133:7002->6379/tcp redis2_server
5e3d9536948a yongboy/redis:latest /usr/bin/redis-serve 19 minutes ago Up 19 minutes 192.168.190.133:7001->6379/tcp redis1_server
在每一個容器實例實際占用內(nèi)存都達(dá)到或接近1G時,會出現(xiàn)內(nèi)存申請出現(xiàn)失敗情況。實際環(huán)境中,這個是需要盡量避免資源超售的。
在不考慮資源超售或理想情況下,一臺服務(wù)服務(wù)器最多可虛擬多少個Redis Server容器實例呢,這個跟網(wǎng)絡(luò)資源有關(guān)。
服務(wù)器對外暴露地址(IP:Port)為二元組,理論上一臺Linux Server可以使用的端口數(shù)量為65535個(去除常用的端口設(shè)為可用端口有65000個),本機可以綁定的IP數(shù)量 * 可用端口數(shù)量 = 單機最大可以對外提供的服務(wù)器接口地址,即Redis Server實例。這些有些無聊了 :))
小結(jié)
雖然Docker到現(xiàn)在還沒有釋出1.0版,但基于Docker構(gòu)建私有還是公有的Service,業(yè)界已經(jīng)給予了很好的一份答案。
國內(nèi)已經(jīng)有百度使用Docker構(gòu)建自己的商用PAAS平臺,詳見Baidu using Docker for its PaaS。當(dāng)然了,國內(nèi)其它PAAS提供商也都在暗中使勁。
http://www.tsuru.io/的開發(fā)者貢獻(xiàn)的tsuru and docker文檔,很好的說明了他們?nèi)绾问褂肈ocker搭建完整的PAAS平臺一些實踐事宜,包括DNS/路由、各種獨立SAAS、服務(wù)發(fā)現(xiàn)等,在架構(gòu)上還是很清晰的。
嗯,有機會,想測測Docker中容器的性能如何。
posted on 2013-12-31 15:39 nieyong 閱讀(9195) 評論(2) 編輯 收藏 所屬分類: 容器