新聞中心
Docker數(shù)據(jù)卷設(shè)計的目的,在于數(shù)據(jù)的永久化,他完全獨立于容器的生存周期,因此,Docker不會在容器刪除時刪除其掛載的數(shù)據(jù)卷,也不會存在類似的垃圾收集機制,對容器引用的數(shù)據(jù)卷進行處理。

一,數(shù)據(jù)卷的使用
有時候需要使用數(shù)據(jù)庫,但是又希望它的數(shù)據(jù)能保存在本地,Docker中提供了數(shù)據(jù)卷可以供你方便的操作數(shù)據(jù)。數(shù)據(jù)卷是一個可供一個或多個容器使用的特殊目錄,它繞過 UFS,可以提供很多有用的特性:
數(shù)據(jù)卷可以在容器之間共享和重用
對數(shù)據(jù)卷的修改會立馬生效
對數(shù)據(jù)卷的更新,不會影響鏡像
數(shù)據(jù)卷默認會一直存在,即使容器被刪除
*注意:數(shù)據(jù)卷的使用,類似于 Linux 下對目錄或文件進行 mount,鏡像中的被指定為掛載點的目錄中的文件會隱藏掉,能顯示看的是掛載的數(shù)據(jù)卷。
Docker 從門到精通(四)一 數(shù)據(jù)卷的使用Docker 從門到精通(四)一 數(shù)據(jù)卷的使用
添加一個數(shù)據(jù)卷:
# docker run -d -it --name busybox -v /data/ busybox
這會在容器內(nèi)創(chuàng)建一個 /data 目錄,并加載一個數(shù)據(jù)卷到容器的 /data 目錄。
進入容器:
# docker exec -it busybox sh
查看目錄映射:
# docker inspect -f {{.Volumes}} busybox
map[/data:/var/lib/docker/volumes/b98191464fb0b1a888507b1e5b324802012297342adfe5d6125bcbfd08b621a9/_data]
可以看到將容器中的 /data 目錄映射到了 /var/lib/docker/volumes/b98191464fb0b1a888507b1e5b324802012297342adfe5d6125bcbfd08b621a9/_data 這個目錄下,所以數(shù)據(jù)在容器中的 /data 目錄和此目錄下是同步的。
[root@sta2 data]# cd /var/lib/docker/volumes/b98191464fb0b1a888507b1e5b324802012297342adfe5d6125bcbfd08b621a9/_data
[root@sta2 _data]# touch b
在容器中 /data 目錄下查看:
/data # ls
a b
b 文件依然存在。
數(shù)據(jù)卷是被設(shè)計用來持久化數(shù)據(jù)的,它的生命周期獨立于容器,Docker不會在容器被刪除后自動刪除數(shù)據(jù)卷,并且也不存在垃圾回收這樣的機制來處理沒有任何容器引用的數(shù)據(jù)卷。如果需要在刪除容器的同時移除數(shù)據(jù)卷。可以在刪除容器的時候使用 docker rm -v 這個命令。
[root@sta2 docker]# docker stop eec30d8d6fce
[root@sta2 docker]# docker rm -v eec30d8d6fce
使用 -v 標記也可以指定掛載一個本地主機的目錄到容器中去,-v 標記也可以從主機掛載單個文件到容器中
[root@sta2 docker]# docker run -it --name mybusybox -v /data:/data busybox sh
這種方法相當于在本機中指定了要映射的目錄,將本地的數(shù)據(jù)卷 /data 目錄加載到容器中的 /data 目錄。
/ # cd /data/
/data # ls
a
/data # touch c
然后在本機的 /data 目錄查看 c 文件是否存在:
[root@sta2 data]# ls
a c
Docker 掛載數(shù)據(jù)卷的默認權(quán)限是讀寫,用戶也可以通過 :ro 指定為只讀。
# docker run -it --name mybusybox -v /data:/data:ro busybox sh
二,數(shù)據(jù)卷容器
如果你有一些持續(xù)更新的數(shù)據(jù)需要在容器之間共享,最好創(chuàng)建數(shù)據(jù)卷容器。
[root@sta2 data]# docker run -d -v /data/ --name dbdata busybox #首先,創(chuàng)建一個名為 dbdata 的數(shù)據(jù)卷容器
然后,在其他容器中使用 –volumes-from 來掛載 dbdata 容器中的數(shù)據(jù)卷。
# docker run -d --volumes-from dbdata --name db1 nginx
# docker run -d --volumes-from dbdata --name db2 nginx
也可以使用 –volumes-from 來掛載來自多個容器的多個數(shù)據(jù)卷:
# docker run -d --name db3 --volumes-from db1 --volumes-from db nginx
提示:使用 –volumes-from 參數(shù)所掛載數(shù)據(jù)卷的容器自己并不需要保持在運行狀態(tài)。
備份數(shù)據(jù)卷
首先使用 –volumes-from 標記來創(chuàng)建一個加載 dbdata 容器卷的容器,并從主機掛載當前目錄到容器的 /backup 目錄。命令如下:
# docker run --volumes-from dbdata -v /data:/backup busybox tar cvf /backup/backup.tar.gz /data/
恢復
如果要恢復數(shù)據(jù)到一個容器,首先創(chuàng)建一個帶有空數(shù)據(jù)卷的容器 dbdata2。
# docker run -v /dbdata --name dbdata2 ubuntu /bin/bash
然后創(chuàng)建另一個容器,掛載 dbdata2 容器卷中的數(shù)據(jù)卷,并使用 untar 解壓備份文件到掛載的容器卷中。
# docker run --volumes-from dbdata2 -v /data:/backup busybox tar xvf /backup/backup.tar.gz
為了查看/驗證恢復的數(shù)據(jù),可以再啟動一個容器掛載同樣的容器卷來查看
# docker run --volumes-from dbdata2 busybox /bin/ls /dbdata
刪除數(shù)據(jù)
如果刪除了掛載的容器(db1 和 db2),數(shù)據(jù)卷并不會被自動刪除。如果要刪除一個數(shù)據(jù)卷,必須在刪除最后一個還掛載著它的容器時使用 docker rm -v 命令來指定同時刪除關(guān)聯(lián)的容器。
網(wǎng)頁標題:詳解Docker數(shù)據(jù)卷使用方法
轉(zhuǎn)載來源:http://www.dlmjj.cn/article/dpijgec.html


咨詢
建站咨詢
