您好,登錄后才能下訂單哦!
這篇“Docker存儲管理的方式有哪些”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“Docker存儲管理的方式有哪些”文章吧。
對于數據來說,我們可以將其保存在容器中,但是會存在一些缺點:
當容器不再運行時,我們無法使用數據,并且容器被刪除時,數據并不會被保存。
數據保存在容器中的可寫層中,我們無法輕松的將數據移動到其他地方。
針對上述的缺點而言,有些數據信息,例如我們的數據庫文件,我們不應該將其保存在鏡像或者容器的可寫層中。Docker 提供三種不同的方式將數據從 Docker 主機掛載到容器中,分別為卷(volumes
),綁定掛載(bind mounts
),臨時文件系統(tmpfs
)。很多時候,volumes 總是正確的選擇。
volumes
卷存儲在 Docker 管理的主機文件系統的一部分中(/var/lib/docker/volumes/
)中,完全由 Docker 管理。
bind mounts
綁定掛載,可以將主機上的文件或目錄掛載到容器中。
tmpfs
僅存儲在主機系統的內存中,而不會寫入主機的文件系統。
無論使用上述的哪一種方式,數據在容器內看上去都是一樣的。它被認為容器文件系統中的目錄或單個文件。
對于三種不同的存儲數據的方式來說,卷是唯一完全由 Docker 管理的。它更容易備份或遷移,并且我們可以使用 Docker CLI
命令來管理卷。
列出本地可用的卷列表可以使用如下命令:
docker volume ls
 運行之后,你可能會看到一些環境中預置鏡像對應的卷,或者顯示為空。
創建卷
創建卷我們可以直接使用如下命令:
docker volume create
上述命令會創建一個數據卷,并且會隨機生成一個名稱。創建之后我們可以查看卷列表:
docker volume ls
這種由系統隨機生成名稱的創建卷的方式被稱為 匿名卷,直接使用該卷需要指定卷名,即自動生成的 ID,所以創建卷時一般手動指定其 name,例如我們創建一個名為 volume1 的卷。
docker volume create volume1
掛載卷
創建卷之后,我們可以用卷來啟動一個容器,這里首先需要學習 docker container run 命令的兩個參數:
-v
或 --volume
由三個由冒號(:)分隔的字段組成,[HOST-DIR:]CONTAINER-DIR[:OPTIONS]
。
HOST-DIR
代表主機上的目錄或數據卷的名字。省略該部分時,會自動創建一個匿名卷。如果是指定主機上的目錄,需要使用絕對路徑。
CONTAINER-DIR
代表將要掛載到容器中的目錄或文件,即表現為容器中的某個目錄或文件。
OPTIONS
代表配置,例如設置為只讀權限(ro
),此卷僅能被該容器使用(Z
),或者可以被多個容器使用(z
)。多個配置項由逗號分隔。
例如,我們使用 -v volume1:/volume1:ro,z
。代表的是意思是將卷 volume1
掛載到容器中的 /volume1
目錄。ro,z
代表該卷被設置為只讀(ro
),并且可以多個容器使用該卷(z
)。
--mount
由多個鍵值對組成,鍵值對之間由逗號分隔。
例如:type=volume,source=volume1,destination=/volume1,ro=true
。
type
,指定類型,可以指定為 bind
,volume
,tmpfs
。
source
,當類型為 volume
時,指定卷名稱,匿名卷時省略該字段。
當類型為 bind
,指定路徑。可以使用縮寫 src
。
destination
,掛載到容器中的路徑。可以使用縮寫 dst
或 target
。
ro
為配置項,多個配置項直接由逗號分隔一般使用 true 或 false
。
針對上述創建的卷 volume1
,用其來運行一個容器就可以使用如下命令:
docker container run \ -it \ --name niuma001 \ -v volume1:/volume1 \ --rm ubuntu /bin/bash
或者我們也可以使用 --mount
,其語法格式如下:
docker container run \ -it --name niuma002 \ --mount type=volume,src=volume1,target=/volume1 \ --rm ubuntu /bin/bash
從命令中,可以很明顯的得出,--mount
的可讀性更好。所以,推薦大家使用 --mount
。
在 docker container run
中我們使用了參數 --rm
,它的作用在容器退出時刪除容器。這里我們創建的鏡像只是希望它短期運行,其用戶數據并無保留的必要,因而可以在容器啟動時設置 --rm
選項,這樣在容器退出時就能夠自動清理容器內部的文件系統。
值得注意的是,后臺運行的容器無法使用 -d
與 --rm
選項。
上述操作,我們分別運行了兩個容器,并分別掛載了一個卷,還可多次使用該參數掛載多個卷或目錄。并且對于這兩個容器來說,由于我們使用的是同一個卷,所以他們將共享該數據卷,但是對于多個容器共享數據卷時,需要注意并發性。大家可以分別連接到兩個容器中,操作數據,驗證其是同步的,這里就不再詳細演示了。
 對于數據卷來說,其優點在于方便管理。而對于綁定掛載 bind-mounts
來說,通過將主機上的目錄綁定到容器中,容器就可以操作和修改主機上該目錄的內容。這既是其優點也是其缺點。
 例如,我們將 /home/xiaoniuma
目錄掛載到容器中的 `/home/xiaoniuma 目錄下,使用的命令如下:
docker container run \ -it \ -v /home/xiaoniuma:/home/xiaoniuma \ --name xiaoniuma003 \ --rm ubuntu /bin/bash
而如果使用的是 --mount,相應的語句如下:
docker container run \ -it \ --mount type=bind,src=/home/xiaoniuma,target=/home/xiaoniuma \ --name xiaoniuma004 \ --rm ubuntu /bin/bash
如果綁定掛載時指定的容器目錄是非空的,則該目錄中的內容將會被覆蓋。并且如果主機上的目錄不存在,會自動創建該目錄。
上述兩個操作針對的是目錄,而對于掛載文件來說,可能會出現一些特殊情況,涉及到綁定掛載和使用卷的區別。下面我們重現這一操作:
1.首先在當前目錄,即 /home/xiaoniuma 目錄下,創建一個 test.txt 文件。并向其中寫入文本內容 “test1”:
echo "test1" > test.txt
2.接著創建一個容器 xiaoniuma005,將 test.txt 文件掛載到容器中的 /test.txt 文件,并查看容器中 /test.txt 文件的內容:
docker container run \ -it \ -v /home/xiaoniuma/test.txt:/test.txt \ --name xiaoniuma005 ubuntu /bin/bash
3.這時新打開一個終端,通過 echo
命令向 /home/xiaoniuma/test.txt
文件追加內容 “test2”,并在容器中查看 /test.txt
文件的內容:
echo "test2" >> test.txt
4.這時無論是在容器中還是主機上都能查看到該文件的內容。接下來在主機上查看 test.txt
的 inode 號。
使用 VIM 編輯該文件,添加 “test3”,并查看該文件的內容:
如上圖所示,在主機上使用 VIM 編輯后,通過 VIM 做出的修改不能在容器中查看到。這是因為 VIM 編輯保存文件的時候,會將文件內容寫入到一個新的文件中,保存好后,刪除掉原來的文件,并將新文件重命名,從而完成保存的操作。但是我們標識文件是通過 inode
,因此 Docker 綁定的主機文件,依舊是 VIM 編輯之前的 inode
,即舊文件。所以容器中看到的,依然是舊的內容。
對于數據卷來說,由 Docker 完全管理,而綁定掛載,則需要我們自己去維護。我們需要自己手動去處理這些問題,這些問題并不僅僅是上面演示的內容,還可能有用戶權限,SELINUX
等問題。
最后簡單說一下臨時文件系統 tmpfs
。它只存儲在主機的內存中。當容器停止時,相應的數據就會被移除。
docker run \ -it \ --mount type=tmpfs,target=/test \ --name xiaoniuma008 \ --rm ubuntu bash
如果容器之間需要共享一些持續更新的數據,最簡單的方式就是使用用戶數據卷容器。其他容器通過掛載這個容器實現數據共享,這個掛載數據卷的容器就叫做數據卷容器。數據卷容器就是一種普通容器,它專門提供數據卷供其它容器掛載使用。
首先,我們創建一個數據卷和數據卷容器,執行的命令如下:
# 創建一個名為 vdata 的數據卷 docker volume create vdata # 創建一個掛載了 vdata 的容器,這個容器就是數據卷容器 docker container run \ -it \ -v vdata:/vdata \ --name XiaoniumaVolume ubuntu /bin/bash # 在 /vdata 目錄下創建一個文本文件 echo "I am XiaoniumaVolume" > /vdata/f.txt
接下來我們分別打開新的終端輸入以下命令,創建兩個容器,在執行 docker container run
時,我們添加參數 --volumes-from
繼承數據卷容器 XiaoniumaVolume
掛載的數據卷。進入容器后分別創建文件
# 創建容器 test1 docker container run \ -it \ --volumes-from XiaoniumaVolume \ --name test1 ubuntu /bin/bash # 查看 vdata 目錄是否存在 ls -dl /vdata/ # 創建一個文件,并寫入內容 echo "I am test1" > /vdata/test1.txt
同樣的,我們執行上述操作,創建容器 test2。
# 創建容器 test2 docker container run \ -it \ --volumes-from XiaoniumaVolume \ --name test2 ubuntu /bin/bash # 查看 vdata 目錄是否存在 ls -dl /vdata/ # 創建一個文件,并寫入內容 echo "I am test2" > /vdata/test2.txt
我們進入到 XiaoniumaVolume 容器所在的終端,在掛載的數據中查看文件的內容:
# 查看數據卷中的內容 ls -al /vdata/
從上圖的結果中我們可以看到,數據卷在三個容器之間是共享的。
 數據存在于數據卷中,如果我們想要備份它,可以采用創建備份容器的方式。
docker container run \ --volumes-from XiaoniumaVolume \ -v /home/xiaoniuma/backup:/backup \ ubuntu tar cvf /backup/backup.tar /vdata/
--volumes-from XiaoniumaVolume
使得備份容器繼承容器 XiaoniumaVolumeVolume
的數據卷。
-v /home/xiaoniuma/backup:/backup
把 /home/xiaoniuma/backup
目錄采用綁定掛載的方式,掛載到容器的 /backup
目錄上。
tar cvf /backup/backup.tar /vdata
容器中執行了這么一條壓縮歸檔命令,將 /vdata
中的全部數據打包到了 /backup/backup.tar
,而剛剛的數據綁定,使得整個壓縮包存在于主機中,從而達到了數據備份的效果。
如上圖所示,數據卷中的所有數據都被打包到了 /home/xiaoniuma/backup 目錄中。
與數據備份相同的方式,我們可以使用如下命令創建恢復容器,來還原數據卷中的數據。
docker container run \ --volumes-from XiaoniumaVolume \ -v /home/xiaoniuma/backup:/backup \ ubuntu tar xvf /backup/backup.tar -C /
這里解壓的路徑為 / 即 /vdata 的上一級目錄。由于與數據備份非常相似,這里不再給出結果分析。
以上就是關于“Docker存儲管理的方式有哪些”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。