八、容器數據管理
docker管理數據的方式有兩種:
8.1 數據卷
數據卷是一個或多個容器專門指定繞過Union File System的目錄,為持續性或共享數據提供一些有用的功能:
- 數據卷可以在容器間共享和重用
- 數據卷數據改變是直接修改的
- 數據卷數據改變不會被包括在容器中
- 數據卷是持續性的,直到沒有容器使用它們
添加一個數據卷
你可以使用-v選項添加一個數據卷,或者可以使用多次-v選項為一個 docker 容器運行掛載多個數據卷。
$ sudo docker run --name data -v /data -t -i ubuntu:14.04 /bin/bash # 創建數據卷綁定到到新建容器,新建容器中會創建 /data 數據卷 bash-4.1# ls -ld /data/
drwxr-xr-x 2 root root 4096 Jul 23 06:59 /data/
bash-4.1# df -Th
Filesystem Type Size Used Avail Use% Mounted on
... ...
ext4 91G 4.6G 82G 6% /data
創建的數據卷可以通過docker inspect獲取宿主機對應路徑
$ sudo docker inspect data
... ... "Volumes": { "/data": "/var/lib/docker/vfs/dir/151de401d268226f96d824fdf444e77a4500aed74c495de5980c807a2ffb7ea9" }, # 可以看到創建的數據卷宿主機路徑 ... ...
或者直接指定獲取
$ sudo docker inspect --format="{{ .Volumes }}" data
map[/data: /var/lib/docker/vfs/dir/151de401d268226f96d824fdf444e77a4500aed74c495de5980c807a2ffb7ea9]
掛載宿主機目錄為一個數據卷
-v選項除了可以創建卷,也可以掛載當前主機的一個目錄到容器中。
$ sudo docker run --name web -v /source/:/web -t -i ubuntu:14.04 /bin/bash
bash-4.1# ls -ld /web/
drwxr-xr-x 2 root root 4096 Jul 23 06:59 /web/
bash-4.1# df -Th
... ...
ext4 91G 4.6G 82G 6% /web
bash-4.1# exit
默認掛載卷是可讀寫的,可以在掛載時指定只讀
$ sudo docker run --rm --name test -v /source/:/test:ro -t -i ubuntu:14.04 /bin/bash
8.2 創建和掛載一個數據卷容器
如果你有一些持久性的數據并且想在容器間共享,或者想用在非持久性的容器上,最好的方法是創建一個數據卷容器,然后從此容器上掛載數據。
創建數據卷容器
$ sudo docker run -t -i -d -v /test --name test ubuntu:14.04 echo hello
使用--volumes-from選項在另一個容器中掛載 /test 卷。不管 test 容器是否運行,其它容器都可以掛載該容器數據卷,當然如果只是單獨的數據卷是沒必要運行容器的。
$ sudo docker run -t -i -d --volumes-from test --name test1 ubuntu:14.04 /bin/bash
添加另一個容器
$ sudo docker run -t -i -d --volumes-from test --name test2 ubuntu:14.04 /bin/bash
也可以繼承其它掛載有 /test 卷的容器
$ sudo docker run -t -i -d --volumes-from test1 --name test3 ubuntu:14.04 /bin/bash
8.3 備份、恢復或遷移數據卷
備份
$ sudo docker run --rm --volumes-from test -v $(pwd):/backup ubuntu:14.04 tar cvf /backup/test.tar /test
tar: Removing leading `/' from member names
/test/
/test/b
/test/d
/test/c
/test/a
啟動一個新的容器并且從test容器中掛載卷,然后掛載當前目錄到容器中為 backup,并備份 test 卷中所有的數據為 test.tar,執行完成之后刪除容器--rm,此時備份就在當前的目錄下,名為test.tar。
$ ls # 宿主機當前目錄下產生了 test 卷的備份文件 test.tar test.tar
恢復
你可以恢復給同一個容器或者另外的容器,新建容器并解壓備份文件到新的容器數據卷
$ sudo docker run -t -i -d -v /test --name test4 ubuntu:14.04 /bin/bash $ sudo docker run --rm --volumes-from test4 -v $(pwd):/backup ubuntu:14.04 tar xvf /backup/test.tar -C / # 恢復之前的文件到新建卷中,執行完后自動刪除容器 test/ test/b test/d test/c test/a
8.4 刪除 Volumes
Volume 只有在下列情況下才能被刪除:
- docker rm -v刪除容器時添加了-v選項
- docker run --rm運行容器時添加了--rm選項
否則,會在/var/lib/docker/vfs/dir目錄中遺留很多不明目錄。
參考文檔: