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