摘要:如果你想刪除包含掛載數(shù)據(jù)卷的容器,甚至是初始化的容器,或者是由擴展的和,容器會刪除,但是數(shù)據(jù)卷會留下。數(shù)據(jù)恢復創(chuàng)建一個新的容器,解壓文件到新的容器的數(shù)據(jù)卷。
前面已經(jīng)介紹了許多基礎(chǔ)的知識,現(xiàn)在我們來一起學習如何管理Docker容器里面以及容器之間的數(shù)據(jù)
先介紹兩種原始的方法來管理Docker中的應(yīng)用:
Data volumes
Data volume container
Data volumesdata volumns是專門設(shè)計的工具,它繞過了UFS直接工作于一個或多個容器。它為數(shù)據(jù)持久和分享提供了許多功能:
容器被創(chuàng)建時,卷(volumn)被初始化。如果基礎(chǔ)鏡像在指定的掛載點包含數(shù)據(jù),這些數(shù)據(jù)也會被復制到新容器的卷中。
數(shù)據(jù)卷可以在多個容器間分享和復用
可以直接更改卷里面的數(shù)據(jù)
更新鏡像時對容器數(shù)據(jù)卷的更改將不會被包含到新的鏡像中
即使容器被刪除,數(shù)據(jù)卷依然存在
數(shù)據(jù)卷的設(shè)計被用來持久化數(shù)據(jù),讓數(shù)據(jù)能夠獨立于容器的生命周期。因此當刪除容器時Docker也不會自動刪除數(shù)據(jù)卷。
Adding a data volume增加數(shù)據(jù)卷
docker create -v和docker run -v中的-v標記來給容器添加數(shù)據(jù)卷,我們可以在一條命令中多次使用-v標記來添加多個數(shù)據(jù)卷,下面的例子掛載了一個數(shù)據(jù)卷在我們的web應(yīng)用容器中。
languagedocker run -d -P --name web -v /webapp training/webapp python app.py
這條命令執(zhí)行后會在容器中創(chuàng)建一個新的卷webapp
Mount a Host Directory as a Data Volume為數(shù)據(jù)卷掛在主機目錄
除了使用-v標記來創(chuàng)建卷之外,你還可以掛載Docker守護進程主機的目錄到容器中。
注意:如果你使用Boot2Docker,那么你的Docker守護進程只能被限制訪問OSX/windows特定的文件目錄。Boot2Docker會努力自動分享OSX中的/users目錄和windows中的C:users目錄。因此你可以通過docker run -v /Users/
:/ ... (OSX)或者docker run -v /c/Users/:/ (Windows).來掛在文件或目錄。所有的其它路徑(不是/users和C:users)都來自Boot2Docker虛擬機中的文件系統(tǒng)。
languagedocker run -d -P --name web -v /src/webapp:/opt/webapp training/webapp python app.py
上述命令會把主機的/src/webapp目錄掛在到容器中的/opt/webapp下
注意:如果/opt/webapp目錄已經(jīng)存在與容器的鏡像中,那么/opt/webapp中的內(nèi)容會被主機上的/src/webapp中的數(shù)據(jù)替換,這個和mount命令是一致的。
數(shù)據(jù)卷掛在數(shù)據(jù)對測試非常有用,比如我們可以把源代碼掛在到容器中,然后修改代碼看看應(yīng)用會發(fā)生什么。主機上的目錄必須是絕對路徑,如果這個目錄不存在Docker會自動去創(chuàng)建1個。
注意:不能在Dockerfile中來配置掛載目錄,因為Dockerfile的目的是更方便的來一直和分享鏡像,而主機目錄依賴于主機,(對于一個目錄,在不同的主機上可能絕對路徑不一致)所以Dockerfile中目錄掛載不會適用于所有的主機
掛載的數(shù)據(jù)卷默認是可讀寫的,當然我們可以通過命令標記來讓它只讀
languagedocker run -d -P --name web -v /src/webapp:/opt/webapp:ro training/webapp python app.py
上述命令中我們通過ro選項來讓數(shù)據(jù)卷只讀
Mount a Host File as a Data Volume掛載主機文件作為數(shù)據(jù)卷
-v標記還可以用來掛在來自主機的文件,而不僅僅是目錄
languagedocker run --rm -it -v ~/.bash_history:/.bash_history ubuntu /bin/bash
上述命令會帶你到一個新容器的shell界面,你會有來自主機的bash歷史。因為容器和主機共享了一個.bash_history文件,所以你在容器中的命令歷史和主機中的歷史都會記錄到.bash_history中,這樣當你退出容器中時,你在容器中的命令歷史被保存下來了,在主機的shell歷史記錄中仍然能夠看到容器中的歷史。
Creating and mounting a Data Volume Container注意:人們會使用很多工具來編輯文件,vi,sed --in-place,這些都會導致文件的索引節(jié)點改變。Docker 1.1.0之前,文件修改會報如sed: cannot rename ./sedKdJ9Dy: Device or resource busy這樣的錯誤。但是在Docker 1.1.0之后,掛載文件讓文件修改變得非常簡單而不需要再去掛在包含這個文件的父目錄了。
創(chuàng)建一個專門防數(shù)據(jù)的數(shù)據(jù)卷容器
如果你有一些持久化的數(shù)據(jù)需要在容器之間共享,或者想從非持久化容器使用持久化數(shù)據(jù)。最好的辦法是創(chuàng)建名為Data的卷容器,把數(shù)據(jù)都掛在到Data容器里
我們創(chuàng)建一個能分享數(shù)據(jù)的命名容器,他不運行任何應(yīng)用,它重復使用training/postgres鏡像以便所有的容器使用同一個層,這樣可以節(jié)省磁盤空間。
languagedocker create -v /dbdata --name dbdata training/postgres /bin/true
我們使用--volumes-from標記來綁定/dbdata卷到另一個容器
languagedocker run -d --volumes-from dbdata --name db1 training/postgres
或者
languagedocker run -d --volumes-from dbdata --name db2 training/postgres
在是上述的例子中,我們在容器中掛在了/dbdata卷,如果恰巧鏡像training/postgres中也有/dbdata這個目錄,那么容器會隱藏鏡像的目錄,而讓容器中的/dbdata目錄可見,新建多個數(shù)據(jù)容器同樣是隱藏鏡像的文件而顯示容器中的文件,這種機制實現(xiàn)了數(shù)據(jù)卷的數(shù)據(jù)共享。
你可以在一條命令中使用多個--volumes-from標記參數(shù)把多個容器的數(shù)據(jù)卷綁定在一起。
上述的代碼中db1和db2是掛載dbdata這個容器來擴展的,你也可以掛載db1或者db2來擴展你的數(shù)據(jù)卷。
language docker run -d --name db3 --volumes-from db1 training/postgres
如果你想刪除包含掛載數(shù)據(jù)卷的容器,甚至是初始化的容器dbdata,或者是由dbdata擴展的db1和db2,容器會刪除,但是數(shù)據(jù)卷會留下。使用docker rm -v來刪除容器的數(shù)據(jù)卷。
Backup, restore, or migrate data volumes注意:當你刪除容器沒有使用-v標記的時候,Docker不會提示警告。沒有使用-v標記刪除容器,會讓殘留的volumns變得“無家可歸”(就是沒有容器再引用這個數(shù)據(jù)卷)。這樣的卷很難刪除而且會占用很多空間,我們正在努力改善數(shù)據(jù)卷的管理,你可以通過pull request #8484來跟進我們的進程。
我們可以利用數(shù)據(jù)卷來有效的備份、恢復和遷移數(shù)據(jù)
languagedocker run --volumes-from dbdata -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata
命令中我們啟動了一個新的容器,它共享了來自dbdata容器的數(shù)據(jù)卷。然后我們掛在了一個本地主機的目錄/backup。最后我們使用tar命令把/dbdata中的數(shù)據(jù)壓縮成dbdata.jar放到/backup中。執(zhí)行結(jié)束我們就完成了數(shù)據(jù)卷的數(shù)據(jù)備份工作。
數(shù)據(jù)恢復
languagedocker run -v /dbdata --name dbdata2 ubuntu /bin/bash docker run --volumes-from dbdata2 -v $(pwd):/backup busybox tar xvf /backup/backup.tar
創(chuàng)建一個新的容器dbdata2,解壓文件到新的容器的數(shù)據(jù)卷。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/26414.html
摘要:此刻的后手指依舊飛速地敲打鍵盤,絲毫沒有要停不下來意思。閱讀本期技術(shù)周刊,你不光能弄明白什么是,使用的意義何在,還將被傳授秘籍,以達的境界。周刊篩選的每篇內(nèi)容,是作者的獨到見解,踩坑總結(jié)和經(jīng)驗分享。 showImg(https://segmentfault.com/img/bVC5qJ?w=900&h=385); 啪嗒啪嗒,啪嗒啪嗒,聽到后排動感十足的清脆鍵盤響,我就能猜到公司程序員定...
摘要:盡管大多數(shù)的服務(wù)器有支持腳本語言的插件,通過這些腳本語言,比如,,,可以產(chǎn)生動態(tài)的內(nèi)容,但是服務(wù)器大多數(shù)旨在為靜態(tài)頁面服務(wù)。 Java服務(wù)器 ??作為Java工程師,服務(wù)器對于我們的開發(fā)工作很重要,將我們開發(fā)好的項目放到服務(wù)器上用戶才可以使用。我們常用到的服務(wù)器有Tomcat、Apache、Nginx等等。對于我們所開發(fā)的應(yīng)用,如何選擇合適的服務(wù)器是個問題。下面簡單的介紹Web服務(wù)器、...
摘要:盡管大多數(shù)的服務(wù)器有支持腳本語言的插件,通過這些腳本語言,比如,,,可以產(chǎn)生動態(tài)的內(nèi)容,但是服務(wù)器大多數(shù)旨在為靜態(tài)頁面服務(wù)。 Java服務(wù)器 ??作為Java工程師,服務(wù)器對于我們的開發(fā)工作很重要,將我們開發(fā)好的項目放到服務(wù)器上用戶才可以使用。我們常用到的服務(wù)器有Tomcat、Apache、Nginx等等。對于我們所開發(fā)的應(yīng)用,如何選擇合適的服務(wù)器是個問題。下面簡單的介紹Web服務(wù)器、...
閱讀 2516·2021-11-25 09:43
閱讀 1275·2021-09-07 10:16
閱讀 2697·2021-08-20 09:38
閱讀 3001·2019-08-30 15:55
閱讀 1555·2019-08-30 13:21
閱讀 972·2019-08-29 15:37
閱讀 1503·2019-08-27 10:56
閱讀 2141·2019-08-26 13:45