AI創想秀,邂逅“華為云ModelArts”征文大賽——第一次收官
1615
2025-04-02
Docker啟動后,容器內的文件和宿主機是隔離的,如果不使用docker commit 操作提交容器為鏡像把數據保存下來,數據就會因為容器的刪除而丟失。而且盡量不使用 docker commit 提交鏡像,因為會導致鏡像無法通過Dockerfile 復現,不利于遷移、重新構建等情況。
為了可以保存數據,又不至于破壞鏡像的可復現特性,Docker 提出了數據卷的概念。數據卷又分為兩種,即數據卷和數據卷容器。
一、什么是數據卷
數據卷簡單來講就是一個目錄,它是由Docker daemon 掛載到容器中的,因此數據卷并不屬于聯合文件系統。也就是說數據卷里面的內容不會因為容器的刪除而丟失。
形象說明數據卷好比一個U盤,可以連接計算機,即使計算機硬盤壞了,只要不影響U盤的,U盤里面的數據不會被損壞。
二、數據卷特性
-數據卷可以在容器之間共享和重用,容器間傳遞數據將變得高效方便;
-對數據卷內數據的修改會立馬生效,無論是容器內操作還是本地操作;
-對數據卷的更新不會影響鏡像,解耦了應用和數據;
-卷會一直存在,直到沒有容器使用,可以安全地卸載它。
三、數據卷的使用
1.在容器內創建一個數據卷
在用docker run命令的時候,使用-v標記可以在容器內創建一個數據卷。多次重復使用-v標記可以創建多個數據卷。
下面使用training/webapp鏡像創建一個web容器,并創建一個數據卷掛載到容器的/webapp目錄:
$?docker?run?-d?-P?--name?web?-v?/webapp?training/webapp?python?app.py
-P是將容器服務暴露的端口,是自動映射到本地主機的臨時端口。
2.掛載一個主機目錄作為數據卷
使用-v標記也可以指定掛載一個本地的已有目錄到容器中去作為數據卷(推薦方式)。
$?docker?run?-d?-P?--name?web?-v?/src/webapp:/opt/webapp?training/webapp?python?app.py
上面的命令加載主機的/src/webapp目錄到容器的/opt/webapp目錄。這個功能在進行測試的時候十分方便,比如用戶可以將一些程序或數據放到本地目錄中,然后在容器內運行和使用。另外,本地目錄的路徑必須是絕對路徑,如果目錄不存在,Docker會自動創建。
Docker掛載數據卷的默認權限是讀寫(rw),用戶也可以通過ro指定為只讀:
$?docker?run?-d?-P?--name?web?-v?/src/webapp:/opt/webapp:ro?training/webapp?python?app.py
加了:ro之后,容器內對所掛載數據卷內的數據就無法修改了。
3.掛載一個本地主機文件作為數據卷
-v標記也可以從主機掛載單個文件到容器中作為數據卷(不推薦)。
$?docker?run?--rm?-it?-v?~/.bash_history:/.bash_history?ubuntu?/bin/bash
這樣就可以記錄在容器輸入過的命令歷史了。如果直接掛載一個文件到容器,使用文件編輯工具,包括vi或者sed--in-place的時候,可能會造成文件inode的改變,從Docker 1.1.0起,這會導致報錯誤信息。所以推薦的方式是直接掛載文件所在的目錄。
三、什么是數據卷容器
使用特定容器維護數據卷。如何使用數據卷容器在容器和主機、容器和容器之間共享數據,并實現數據的備份和恢復。
如果用戶需要在多個容器之間共享一些持續更新的數據,最簡單的方式是使用數據卷容器。數據卷容器也是一個容器,但是它的目的是專門用來提供數據卷供其他容器掛載。
四、數據卷容器實現數據遷移
1.備份
使用下面的命令來備份dbdata數據卷容器內的數據卷:
$?docker?run?--volumes-from?dbdata?-v?$(pwd):/backup?--name?worker?ubuntu?tar?cvf?/backup/backup.tar?/dbdata
首先利用ubuntu鏡像創建了一個容器worker。使用--volumes-from dbdata參數來讓worker容器掛載dbdata容器的數據卷(即dbdata數據卷),使用-v ?$(pwd):/backup參數來掛載本地的當前目錄到worker容器的/backup目錄。worker容器啟動后,使用了tar cvf ?/backup/backup.tar /dbdata命令來將/dbdata下內容備份為容器內的/backup/backup.tar,即宿主主機當前目錄下的backup.tar。
2.恢復
如果要將數據恢復到一個容器,可以按照下面的步驟操作。
首先創建一個帶有數據卷的容器dbdata2:
$?docker?run?-v?/dbdata?--name?dbdata2?ubuntu?/bin/bash
然后創建另一個新的容器,掛載dbdata2的容器,并使用untar解壓備份文件到所掛載的容器卷中:
$?docker?run?--volumes-from?dbdata2?-v?$(pwd):/backup?--name?worker?ubuntu?bashcd?/dbdatatar?xvf?/backup/backup.tar
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。