談一談容器的持久存儲(chǔ)實(shí)例
簡(jiǎn)介
容器的持久存儲(chǔ)有多個(gè)解決方案,本文針對(duì)的是運(yùn)行在容器里的應(yīng)用的持久存儲(chǔ)。除了Docker自帶的Volumes解決方案外,還有開(kāi)源的解決方案(Flocker,Torus),也有商用的解決方案(Portworx)。本文提供了一個(gè)Docker Volumes和NFS結(jié)合起來(lái)的解決方案,并且介紹了具體的實(shí)施步驟。
這個(gè)方案的體系架構(gòu)是Docker,NFS Mount和數(shù)據(jù)庫(kù)相結(jié)合的綜合產(chǎn)物。NFS和數(shù)據(jù)庫(kù)可以運(yùn)行在不同的服務(wù)器上。數(shù)據(jù)庫(kù)不只是單機(jī)數(shù)據(jù)庫(kù),也可以是集群數(shù)據(jù)庫(kù)。本文的實(shí)例是運(yùn)行在一臺(tái)8個(gè)內(nèi)核16GB內(nèi)存的Linux主機(jī)上的。其在主機(jī)上的容器如下:
Linux上的Docker NFS掛載
NFS(網(wǎng)絡(luò)文件系統(tǒng))是一個(gè)允許用戶遠(yuǎn)程存儲(chǔ)文件的協(xié)議,廣泛應(yīng)用于Linux操作系統(tǒng)中。NFS同時(shí)也是遠(yuǎn)程進(jìn)行持久存儲(chǔ)的一種方式。這里利用NFS和Docker的Volumes結(jié)合起來(lái)解決Docker容器的持久存儲(chǔ)問(wèn)題。
NFS不一定要安裝在主機(jī)裸機(jī)上,也可以運(yùn)行在容器里。Docker Hub上有了一個(gè)相當(dāng)不錯(cuò)的NFS Docker鏡像,可以把容器里的一個(gè)路徑展示給主機(jī),以便在主機(jī)的文件系統(tǒng)上形成一個(gè)掛載(mount):
https://hub.docker.com/r/mnagy/nfs-server/
本例使用如下命令啟動(dòng)NFS服務(wù)器容器:
- docker run -d --net=bridge --privileged --name nfs-server mnagy/nfs-server /exports/portworx
這里面“/exports/portworx” 是主機(jī)可以掛載的容器里的路徑。
主機(jī)是利用如下的命令把容器里的路徑“/exports/portworx”在主機(jī)上形成NFS掛載的:
- sudo mount 10.255.0.1:/exports/portworx /mnt2
NFS服務(wù)器的IP地址可以通過(guò)Docker命令來(lái)找到:
- docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' nfs-server
- 10.255.0.1
Redis在NFS掛載上的持久存儲(chǔ)
談到持久存儲(chǔ)就需要持久存儲(chǔ)的工具。數(shù)據(jù)庫(kù)是很好的持久存儲(chǔ)的工具。數(shù)據(jù)庫(kù)類的應(yīng)用有很多種,這里采用被廣泛認(rèn)可的Redis鍵值存儲(chǔ)應(yīng)用。
下面的鏈接是一個(gè)很好的Redis Docker鏡像,我們可以用來(lái)快速運(yùn)行一個(gè)容器來(lái)存儲(chǔ)持久數(shù)據(jù):
- https://hub.docker.com/_/redis/
當(dāng)我們啟動(dòng)了Redis的持久存儲(chǔ)功能,數(shù)據(jù)就會(huì)保存在Redis的一個(gè)叫Data的卷里。然后我們可以把Redis的這個(gè)卷映射到主機(jī)的/mnt2路徑,這樣就可以和NFS掛載機(jī)制聯(lián)系起來(lái):
- docker run --name redis-server-wma -v /mnt2:/data -d redis redis-server --appendonly yes
向Redis發(fā)送數(shù)據(jù)
為了完整的展示一個(gè)實(shí)例,我們要向Redis發(fā)送大量模擬數(shù)據(jù)。我們想看到的是數(shù)據(jù)最終落到NFS服務(wù)器上。我們將利用Shell腳碼來(lái)向Redis發(fā)送數(shù)據(jù)。
首先,我們運(yùn)行一個(gè)交互模式的Redis客戶端容器:
- docker run --name redis-client --link redis-server-wma:redis -it alpine
然后, 我們運(yùn)行如下的命令來(lái)發(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
這就驗(yàn)證了Docker Volumes和NFS相結(jié)合的解決方案是有效的。