摘要:如果你想刪除包含掛載數據卷的容器,甚至是初始化的容器,或者是由擴展的和,容器會刪除,但是數據卷會留下。數據恢復創建一個新的容器,解壓文件到新的容器的數據卷。
前面已經介紹了許多基礎的知識,現在我們來一起學習如何管理Docker容器里面以及容器之間的數據
先介紹兩種原始的方法來管理Docker中的應用:
Data volumes
Data volume container
Data volumesdata volumns是專門設計的工具,它繞過了UFS直接工作于一個或多個容器。它為數據持久和分享提供了許多功能:
容器被創建時,卷(volumn)被初始化。如果基礎鏡像在指定的掛載點包含數據,這些數據也會被復制到新容器的卷中。
數據卷可以在多個容器間分享和復用
可以直接更改卷里面的數據
更新鏡像時對容器數據卷的更改將不會被包含到新的鏡像中
即使容器被刪除,數據卷依然存在
數據卷的設計被用來持久化數據,讓數據能夠獨立于容器的生命周期。因此當刪除容器時Docker也不會自動刪除數據卷。
Adding a data volume增加數據卷
docker create -v和docker run -v中的-v標記來給容器添加數據卷,我們可以在一條命令中多次使用-v標記來添加多個數據卷,下面的例子掛載了一個數據卷在我們的web應用容器中。
languagedocker run -d -P --name web -v /webapp training/webapp python app.py
這條命令執行后會在容器中創建一個新的卷webapp
Mount a Host Directory as a Data Volume為數據卷掛在主機目錄
除了使用-v標記來創建卷之外,你還可以掛載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虛擬機中的文件系統。
languagedocker run -d -P --name web -v /src/webapp:/opt/webapp training/webapp python app.py
上述命令會把主機的/src/webapp目錄掛在到容器中的/opt/webapp下
注意:如果/opt/webapp目錄已經存在與容器的鏡像中,那么/opt/webapp中的內容會被主機上的/src/webapp中的數據替換,這個和mount命令是一致的。
數據卷掛在數據對測試非常有用,比如我們可以把源代碼掛在到容器中,然后修改代碼看看應用會發生什么。主機上的目錄必須是絕對路徑,如果這個目錄不存在Docker會自動去創建1個。
注意:不能在Dockerfile中來配置掛載目錄,因為Dockerfile的目的是更方便的來一直和分享鏡像,而主機目錄依賴于主機,(對于一個目錄,在不同的主機上可能絕對路徑不一致)所以Dockerfile中目錄掛載不會適用于所有的主機
掛載的數據卷默認是可讀寫的,當然我們可以通過命令標記來讓它只讀
languagedocker run -d -P --name web -v /src/webapp:/opt/webapp:ro training/webapp python app.py
上述命令中我們通過ro選項來讓數據卷只讀
Mount a Host File as a Data Volume掛載主機文件作為數據卷
-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,這些都會導致文件的索引節點改變。Docker 1.1.0之前,文件修改會報如sed: cannot rename ./sedKdJ9Dy: Device or resource busy這樣的錯誤。但是在Docker 1.1.0之后,掛載文件讓文件修改變得非常簡單而不需要再去掛在包含這個文件的父目錄了。
創建一個專門防數據的數據卷容器
如果你有一些持久化的數據需要在容器之間共享,或者想從非持久化容器使用持久化數據。最好的辦法是創建名為Data的卷容器,把數據都掛在到Data容器里
我們創建一個能分享數據的命名容器,他不運行任何應用,它重復使用training/postgres鏡像以便所有的容器使用同一個層,這樣可以節省磁盤空間。
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目錄可見,新建多個數據容器同樣是隱藏鏡像的文件而顯示容器中的文件,這種機制實現了數據卷的數據共享。
你可以在一條命令中使用多個--volumes-from標記參數把多個容器的數據卷綁定在一起。
上述的代碼中db1和db2是掛載dbdata這個容器來擴展的,你也可以掛載db1或者db2來擴展你的數據卷。
language docker run -d --name db3 --volumes-from db1 training/postgres
如果你想刪除包含掛載數據卷的容器,甚至是初始化的容器dbdata,或者是由dbdata擴展的db1和db2,容器會刪除,但是數據卷會留下。使用docker rm -v來刪除容器的數據卷。
Backup, restore, or migrate data volumes注意:當你刪除容器沒有使用-v標記的時候,Docker不會提示警告。沒有使用-v標記刪除容器,會讓殘留的volumns變得“無家可歸”(就是沒有容器再引用這個數據卷)。這樣的卷很難刪除而且會占用很多空間,我們正在努力改善數據卷的管理,你可以通過pull request #8484來跟進我們的進程。
我們可以利用數據卷來有效的備份、恢復和遷移數據
languagedocker run --volumes-from dbdata -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata
命令中我們啟動了一個新的容器,它共享了來自dbdata容器的數據卷。然后我們掛在了一個本地主機的目錄/backup。最后我們使用tar命令把/dbdata中的數據壓縮成dbdata.jar放到/backup中。執行結束我們就完成了數據卷的數據備份工作。
數據恢復
languagedocker run -v /dbdata --name dbdata2 ubuntu /bin/bash docker run --volumes-from dbdata2 -v $(pwd):/backup busybox tar xvf /backup/backup.tar
創建一個新的容器dbdata2,解壓文件到新的容器的數據卷。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/26414.html
摘要:此刻的后手指依舊飛速地敲打鍵盤,絲毫沒有要停不下來意思。閱讀本期技術周刊,你不光能弄明白什么是,使用的意義何在,還將被傳授秘籍,以達的境界。周刊篩選的每篇內容,是作者的獨到見解,踩坑總結和經驗分享。 showImg(https://segmentfault.com/img/bVC5qJ?w=900&h=385); 啪嗒啪嗒,啪嗒啪嗒,聽到后排動感十足的清脆鍵盤響,我就能猜到公司程序員定...
閱讀 2422·2021-11-25 09:43
閱讀 1202·2021-09-07 10:16
閱讀 2616·2021-08-20 09:38
閱讀 2943·2019-08-30 15:55
閱讀 1462·2019-08-30 13:21
閱讀 894·2019-08-29 15:37
閱讀 1446·2019-08-27 10:56
閱讀 2097·2019-08-26 13:45