docker中關於volume(mongo持久化爲例)

說起docker持久化我們就肯定會想到volume
這篇文章主要講兩個知識點

  • docker運行鏡像時進行持久化
  • docker自動創建的volume
  • 刪除自動創建的volume

所用docker版本:
在這裏插入圖片描述
今天我在docker上拉取了一下mongodb,就順便拿mongodb這個鏡像來說明我發現的問題
拉取過程不再說了,直接運行我的mongo鏡像

docker 運行鏡像時進行持久化

注意:這裏的持久化目錄僅僅是mongo的持久化目錄,不同鏡像目錄也會不同,這裏只以mongo爲例

docker run -d -p 27017:27017 -v /opt/docker/volume/mongo/db:/data/db -v /opt/docker/volume/mongo/config:/data/config --name mongo01 mongo:latest

啓動後我們運行docker inspect mongo01,找到下邊內容就說明我們持久化成功了,這兩個目錄會與我們容器中的數據保持一致,數據也就不會丟了,看到這裏不要停,繼續看你還會有收穫
在這裏插入圖片描述

docker自動創建volume

但是我後來再次啓動新容器時並沒有進行掛載,但是我更改的數據在我重新啓動docker後數據並沒有變,這我就很奇怪了,我並沒有進行持久化掛在呀,然後我就用docker volume ls進行查看,發現如下
在這裏插入圖片描述
這讓我猜測到docker可能啓動新容器時自動爲我們創建了volume,圖上的兩個volume可能就是對應我的mongo config和db數據,接下來進行驗證:
首先我仍然用docker inspect 新容器名查看我的信息,結果如下,也就是說這兩個就是我的新容器的持久化掛載,而且文件是在我們的宿主機中,這更加證實了我的猜想:
在這裏插入圖片描述

我也聽過docker要用命令進行持久化,難道我是新版的docker?然後我進入容器中(命令:docker exec -it 容器名 bash),使用mongo命令進入mongodb,然後對mongo進行如下操作,大致就是我創建了一個名爲geo的collection
在這裏插入圖片描述
接下來就是印證持久化的重要作用之一:可以共享掛載數據。我執行如下命令再建一個容器(這次我是拿mongotest的自動創建的volume之一(以下這個是我覺得存db內容的volume),我是在volume所在文件夾下,所以沒有用絕對路徑)

docker run -d -p 27019:27017 -v adfabea14b0de580c2a4662610cdb173309529ce7fed263798bdfcea8e38d784:/data/db --name mongotest2 mongo:latest

啓動後我們進入mongotest2的mongo中進行查看,可以看到我們看到了我們在mongotest中創建的collection,並通過共享volume共享給了新創建的mongotest2,猜想算是證實了
在這裏插入圖片描述
我們再看此時的volume list
在這裏插入圖片描述
可以看出第一行是多的,第二行就是我們上邊共享的dbvolume,所以我猜第一行就是我們的mongotest2的config的持久掛載,當然可能不同鏡像的掛載數量也不同吧,這裏我只演示了mongo的,但重點是:docker自動爲我們進行了持久化,而且我們也對持久化數據可以在容器間共享做了一下實踐

刪除自動創建的volume

docker自動創建的volume等容器刪除後也不會進行刪除,需要我們手動去刪除,這裏問題就出來了,我們怎麼知道哪個volume是服務哪個容器,這個我目前還真沒找到方法,當然如果容器存在可以用docker inspect命令,但容器不存在呢,這我們難道一個個排除得出哪volume服務的容器已經刪除了?我們可以直接執行docker volume rm volume名稱命令,如果該volume服務的容器還在就不能刪除:
在這裏插入圖片描述
我們把容器刪除再來看,就刪除成功了:
在這裏插入圖片描述

發佈了49 篇原創文章 · 獲贊 20 · 訪問量 7581
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章