Docker基礎之九: 管理容器的數據
管理容器的數據
(對Docker感興趣的朋友可以加我的微信ghostcloud2016,然後我把你加到我們的一個Docker愛好者群組裏麵。)
到目前為止,我們已經介紹了Docker的一些基本概念,如:容器的操作,鏡像的操作和網絡的操作等。在本節,我們將介紹如何管理容器內部的數據,以及容器間的數據交互。我們將介紹如何創建:
- 數據卷
- 數據型容器
1 數據卷
數據卷是一個經過特殊設計的文件夾,提供給容器使用。數據卷並不由UnionFS管理,因此數據卷可以用作持久化和數據分享,它具有以下特性:
- 數據卷在容器創建的時候進行初始化。如果容器的鏡像在特定的Mount點下有數據,那麼已有的數據將被拷貝到指定目錄。
- 數據卷可以在容器間共享和複用
- 對數據卷的改變是直接操作,不會回滾。
- 當你更新鏡像時,數據卷的改變不會被保存。
- 即使容器被刪除了,數據卷也不會丟失。
因此,數據卷是用來持久化數據的,跟容器本身的生命周期是無關的。Docker刪除容器的時候,不會自動刪除數據卷,因此當你使用數據卷的時候也要注意不要產生過多的垃圾數據。
2 添加數據卷
數據卷是通過-v來指定的,在docker create和docker run的時候可以使用多個-v參數,指定多個數據卷。
$ docker run -d -P --name web -v /webapp training/webapp python app.py
這條命令在創建容器時,會創建一個/webapp目錄。 注意:我們也可以通過VOLUME指令在Dockerfile中指定需要Mount的數據卷。 默認情況下,數據卷是可讀可寫的,但是你也可以設置為隻讀:
$ docker run -d -P --name web -v /opt/webapp:ro training/webapp python app.py
3 定位卷的位置
$ docker inspect web
...
Mounts": [
{
"Name": "fac362...80535",
"Source": "/var/lib/docker/volumes/fac362...80535/_data",
"Destination": "/webapp",
"Driver": "local",
"Mode": "",
"RW": true
}
]
...
其中source是文件係統在主機上的地址(注意這個地址是隨機分配的,因此一定要注意垃圾回收),Destination是容器中的地址。
4 Mount本地文件夾作為數據卷
通過-v我們可以給容器添加一個隨機的數據卷,但是這種卷是不好控製的,因此我們可以Mount一個本地文件夾作為數據卷。
$ docker run -d -P --name web -v /src/webapp:/opt/webapp training/webapp python app.py
上麵這條命令,我們將本地的/src/webapp映射到了容器的/opt/webapp目錄。由於將主機的文件係統映射到了容器中,因此容器有了主機的完全訪問權限,因此一定要注意安全。
5 Mount本地文件到容器中
-v參數除了可以Mount文件夾,還可以做文件的映射。比如:
$ docker run --rm -it -v ~/.bash_history:/.bash_history ubuntu /bin/bash
這條命令,將把主機的~/.bash_histroy映射到容器中,因此主機和容器可以共享Bash命令的曆史數據。如果將~/.bash_profile映射進去,那就可以共享Bash的配置。
6 數據型容器
如果你希望在容器間共享卷,那麼就可以使用數據型容器。我們可以先創建一個命名容器:
$ docker create -v /dbdata --name dbdata ubuntu
接下來,我們通過--volumes-from選項來進行數據卷的複用:
$ docker run -it --volumes-from dbdata --name db1 ubuntu
然後再建一個容器:
$ docker run -it --volumes-from dbdata --name db2 ubuntu
之後我們就可以在db1和db2中同時對/dbdata進行操作了。
7 數據備份、還原和遷移
我們可以通過下麵的命令進行數據備份:
$ docker run --volumes-from dbdata -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata
- --volumes-from將把dbdata容器的數據卷Mount到當前容器;
- -v 將當前目錄映射到/backup目錄
- tar命令將/dbdata打包
接下來,我們可以對容器進行數據恢複:
$ docker run -v /dbdata --name dbdata2 ubuntu /bin/bash
$ docker run --volumes-from dbstore2 -v $(pwd):/backup ubuntu bash -c "cd /dbdata && tar xvf /backup/backup.tar"
通過上麵的操作,我們就可以自動備份、還原和遷移數據了。
8 注意事項
由於數據卷的共享,會出現多個容器同時寫一個卷的情況,因此可能會導致數據丟失,這裏麵一定要特別注意。可以采取一定的同步機製來保證數據的一致性。
最後更新:2017-04-01 13:38:50