Docker學(xué)習(xí)筆記(六)容器數(shù)據(jù)管理
八、容器數(shù)據(jù)管理
docker管理數(shù)據(jù)的方式有兩種:
- 數(shù)據(jù)卷
- 數(shù)據(jù)卷容器
8.1 數(shù)據(jù)卷
數(shù)據(jù)卷是一個(gè)或多個(gè)容器專門指定繞過Union File System的目錄,為持續(xù)性或共享數(shù)據(jù)提供一些有用的功能:
- 數(shù)據(jù)卷可以在容器間共享和重用
- 數(shù)據(jù)卷數(shù)據(jù)改變是直接修改的
- 數(shù)據(jù)卷數(shù)據(jù)改變不會(huì)被包括在容器中
- 數(shù)據(jù)卷是持續(xù)性的,直到?jīng)]有容器使用它們
添加一個(gè)數(shù)據(jù)卷
你可以使用-v選項(xiàng)添加一個(gè)數(shù)據(jù)卷,或者可以使用多次-v選項(xiàng)為一個(gè) docker 容器運(yùn)行掛載多個(gè)數(shù)據(jù)卷。
$ sudo docker run --name data -v /data -t -i ubuntu:14.04 /bin/bash # 創(chuàng)建數(shù)據(jù)卷綁定到到新建容器,新建容器中會(huì)創(chuàng)建 /data 數(shù)據(jù)卷 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
創(chuàng)建的數(shù)據(jù)卷可以通過docker inspect獲取宿主機(jī)對(duì)應(yīng)路徑
$ sudo docker inspect data ... ... "Volumes": { "/data": "/var/lib/docker/vfs/dir/151de401d268226f96d824fdf444e77a4500aed74c495de5980c807a2ffb7ea9" }, # 可以看到創(chuàng)建的數(shù)據(jù)卷宿主機(jī)路徑 ... ...
或者直接指定獲取
$ sudo docker inspect --format="{{ .Volumes }}" data map[/data: /var/lib/docker/vfs/dir/151de401d268226f96d824fdf444e77a4500aed74c495de5980c807a2ffb7ea9]
掛載宿主機(jī)目錄為一個(gè)數(shù)據(jù)卷
-v選項(xiàng)除了可以創(chuàng)建卷,也可以掛載當(dāng)前主機(jī)的一個(gè)目錄到容器中。
$ 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
默認(rèn)掛載卷是可讀寫的,可以在掛載時(shí)指定只讀
$ sudo docker run --rm --name test -v /source/:/test:ro -t -i ubuntu:14.04 /bin/bash
8.2 創(chuàng)建和掛載一個(gè)數(shù)據(jù)卷容器
如果你有一些持久性的數(shù)據(jù)并且想在容器間共享,或者想用在非持久性的容器上,最好的方法是創(chuàng)建一個(gè)數(shù)據(jù)卷容器,然后從此容器上掛載數(shù)據(jù)。
創(chuàng)建數(shù)據(jù)卷容器
$ sudo docker run -t -i -d -v /test --name test ubuntu:14.04 echo hello
使用--volumes-from選項(xiàng)在另一個(gè)容器中掛載 /test 卷。不管 test 容器是否運(yùn)行,其它容器都可以掛載該容器數(shù)據(jù)卷,當(dāng)然如果只是單獨(dú)的數(shù)據(jù)卷是沒必要運(yùn)行容器的。
$ sudo docker run -t -i -d --volumes-from test --name test1 ubuntu:14.04 /bin/bash
添加另一個(gè)容器
$ 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 備份、恢復(fù)或遷移數(shù)據(jù)卷
備份
$ 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
啟動(dòng)一個(gè)新的容器并且從test容器中掛載卷,然后掛載當(dāng)前目錄到容器中為 backup,并備份 test 卷中所有的數(shù)據(jù)為 test.tar,執(zhí)行完成之后刪除容器--rm,此時(shí)備份就在當(dāng)前的目錄下,名為test.tar。
$ ls # 宿主機(jī)當(dāng)前目錄下產(chǎn)生了 test 卷的備份文件 test.tar test.tar
恢復(fù)
你可以恢復(fù)給同一個(gè)容器或者另外的容器,新建容器并解壓備份文件到新的容器數(shù)據(jù)卷
$ 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 / # 恢復(fù)之前的文件到新建卷中,執(zhí)行完后自動(dòng)刪除容器 test/ test/b test/d test/c test/a
8.4 刪除 Volumes
Volume 只有在下列情況下才能被刪除:
- docker rm -v刪除容器時(shí)添加了-v選項(xiàng)
- docker run --rm運(yùn)行容器時(shí)添加了--rm選項(xiàng)
否則,會(huì)在/var/lib/docker/vfs/dir目錄中遺留很多不明目錄。
參考文檔:
posted on 2016-12-27 21:39 做強(qiáng)大的自己 閱讀(139) 評(píng)論(0) 編輯 收藏