談一談容器的持久存儲實例
簡介
容器的持久存儲有多個解決方案,本文針對的是運行在容器里的應(yīng)用的持久存儲。除了Docker自帶的Volumes解決方案外,還有開源的解決方案(Flocker,Torus),也有商用的解決方案(Portworx)。本文提供了一個Docker Volumes和NFS結(jié)合起來的解決方案,并且介紹了具體的實施步驟。
這個方案的體系架構(gòu)是Docker,NFS Mount和數(shù)據(jù)庫相結(jié)合的綜合產(chǎn)物。NFS和數(shù)據(jù)庫可以運行在不同的服務(wù)器上。數(shù)據(jù)庫不只是單機數(shù)據(jù)庫,也可以是集群數(shù)據(jù)庫。本文的實例是運行在一臺8個內(nèi)核16GB內(nèi)存的Linux主機上的。其在主機上的容器如下:
Linux上的Docker NFS掛載
NFS(網(wǎng)絡(luò)文件系統(tǒng))是一個允許用戶遠程存儲文件的協(xié)議,廣泛應(yīng)用于Linux操作系統(tǒng)中。NFS同時也是遠程進行持久存儲的一種方式。這里利用NFS和Docker的Volumes結(jié)合起來解決Docker容器的持久存儲問題。
NFS不一定要安裝在主機裸機上,也可以運行在容器里。Docker Hub上有了一個相當(dāng)不錯的NFS Docker鏡像,可以把容器里的一個路徑展示給主機,以便在主機的文件系統(tǒng)上形成一個掛載(mount):
https://hub.docker.com/r/mnagy/nfs-server/
本例使用如下命令啟動NFS服務(wù)器容器:
- docker run -d --net=bridge --privileged --name nfs-server mnagy/nfs-server /exports/portworx
這里面“/exports/portworx” 是主機可以掛載的容器里的路徑。
主機是利用如下的命令把容器里的路徑“/exports/portworx”在主機上形成NFS掛載的:
- sudo mount 10.255.0.1:/exports/portworx /mnt2
NFS服務(wù)器的IP地址可以通過Docker命令來找到:
- docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' nfs-server
- 10.255.0.1
Redis在NFS掛載上的持久存儲
談到持久存儲就需要持久存儲的工具。數(shù)據(jù)庫是很好的持久存儲的工具。數(shù)據(jù)庫類的應(yīng)用有很多種,這里采用被廣泛認可的Redis鍵值存儲應(yīng)用。
下面的鏈接是一個很好的Redis Docker鏡像,我們可以用來快速運行一個容器來存儲持久數(shù)據(jù):
- https://hub.docker.com/_/redis/
當(dāng)我們啟動了Redis的持久存儲功能,數(shù)據(jù)就會保存在Redis的一個叫Data的卷里。然后我們可以把Redis的這個卷映射到主機的/mnt2路徑,這樣就可以和NFS掛載機制聯(lián)系起來:
- docker run --name redis-server-wma -v /mnt2:/data -d redis redis-server --appendonly yes
向Redis發(fā)送數(shù)據(jù)
為了完整的展示一個實例,我們要向Redis發(fā)送大量模擬數(shù)據(jù)。我們想看到的是數(shù)據(jù)最終落到NFS服務(wù)器上。我們將利用Shell腳碼來向Redis發(fā)送數(shù)據(jù)。
首先,我們運行一個交互模式的Redis客戶端容器:
- docker run --name redis-client --link redis-server-wma:redis -it alpine
然后, 我們運行如下的命令來發(fā)送數(shù)據(jù):
- for i in `seq 10000000`; do redis-cli -h redis -p 6379 SET users:app "{id: '$i', name: 'name$i', address: 'address$i' }" ; done
之后我們可以登陸nfs-server:
- docker exec -it nfs-server /bin/bash
我們可以看到NFS服務(wù)器的export 路徑填滿了數(shù)據(jù),并且數(shù)據(jù)不斷增漲:
- [root@02040860a13d /]# ls -alh /exports/portworx/
- total 19M
- drwxrwxrwx 2 999 27 4.0K Nov 6 21:58 .
- drwxr-xr-x 3 root root 4.0K Nov 6 10:41 ..
- -rw-r--r-- 1 999 input 19M Nov 6 22:17 appendonly.aof
這就驗證了Docker Volumes和NFS相結(jié)合的解決方案是有效的。