自己學Docker:5.Docker的數據持久化之數據卷

首先,別忘記之前的兩個問題:
1. 如何保存我們在容器裏的修改?
2. 如果apt-get如果不能安裝時,如何在Docker中安裝軟件?

刪除容器命令

在此之前,先記一個命令,

sudo docker rm ID/NAME

即刪除創建的容器.如
這裏寫圖片描述
現在刪除id爲”cc8a23b1d624”的容器.

sudo docker rm cc8a23b1d624

這裏寫圖片描述
可以看到,id爲cc8a23b1d624的容器被刪除了.
這裏寫圖片描述
而且可以發現,本地的/var/lib/docker/containers目錄下的對應目錄也被刪除了.
下面討論Docker的數據持久化.

數據卷

數據卷的創建

官方的解釋是:數據卷是一個可供一個或多個容器使用的特殊目錄,它繞過 UFS.
UFS即是UNIX文件系統的簡稱.

  1. 數據卷可以在容器之間共享和重用
  2. 對數據卷的修改會立馬生效
  3. 對數據卷的更新,不會影響鏡像
  4. 數據卷默認會一直存在,即使容器被刪除
    數據卷的使用,類似於 Linux 下對目錄或文件進行 mount,鏡像中的被指定爲掛載點的目錄中的文件會隱藏掉,能顯示看的是掛載的數據卷。
    如創建容器時使用參數v指定一個目錄,
sudo docker run -i -t --name DataTest -v /home/mungo/workspace/docker/container_data:/data docker/whalesay /bin/bash

這樣我們掛載了一個數據卷.如果/home/mungo/workspace/docker/container_data目錄不存在,Docker會自動創建該目錄.
這裏寫圖片描述
上面的命令就是將container_data掛在到了容器的/data下.在容器中可以看到:
這裏寫圖片描述
上次,瞭解到如何查看容器詳情的方法,即:

sudo docker inspect DataTest

這裏”DataTest”即是剛纔創建容器指定的名稱.上面返回的json格式的容器信息,查看Mounts節點數據.如下:
這裏寫圖片描述
可以看到Mounts下正是我們創建時指定的目錄.
這個功能十分方便,像之前的第二個問題–如果apt-get如果不能安裝時,如何在Docker中安裝軟件?這時用戶可以放置一些程序到本地目錄中,然後就可以安裝了。注意的是本地目錄的路徑必須是絕對路徑
比如我將一個文件vscode-amd64.deb複製到掛在的目錄,然後在docker的容器中就可以直接看到了.
這裏寫圖片描述
值得注意的是:Docker 掛載數據卷的默認權限是讀寫,用戶也可以通過 :ro 指定爲只讀。

sudo docker run -i -t --name DataTest -v /home/mungo/workspace/docker/container_data:/data:ro docker/whalesay /bin/bash

至此,之前的留下的問題算是解決了一個.

數據卷的數據共享

那麼既然可以將本地的目錄掛在到Docker容器中,掛載的數據卷是否可以再被其他的Docker容器使用呢?

sudo docker run -i -t --name DataTest2 -v /home/mungo/workspace/docker/container_data:/data docker/whalesay /bin/bash

這裏寫圖片描述
可以發現name爲”DataTest”和”DataTest2”的容器都是啓動的.同時他們掛在了宿主主機的同一個目錄,在各自的容器中看到的是一一致的.
然後在”DataTest2”創建一個文件–“test.txt “,在去查看”DataTest”的掛在目錄和宿主本地的被掛載目錄,發現新建的”test.txt”文件都存在.
這裏寫圖片描述
之後再在”DataTest”修改文件”test.txt”增加”hello”.分別取三個地方查看,發現三個地方的結果是一致的.
這裏寫圖片描述

數據卷的刪除

通過上面的介紹可以瞭解到:數據卷是被設計用來持久化數據的.那麼,它的生命週期和容器有什麼關係?刪除容器數據卷會不會被連帶刪除?
下面我退出容器DataTest2並刪除它.
這裏寫圖片描述
在容器DataTest和宿主本機本地中查看上面掛在的數據卷.
這裏寫圖片描述
可以發現,在容器DataTest和宿主本機本地之前的更改都在.
所以,數據卷的生命週期獨立於容器,Docker不會在容器被刪除後自動刪除數據卷,同時也不存在垃圾回收這樣的機制來處理沒有任何容器引用的數據卷。
如果需要在刪除容器的同時移除數據卷。查到資料說可以在刪除容器的時候使用 docker rm -v 這個命令。可是我嘗試了沒有成功,不知什麼原因.
不過這些無主的數據卷可能會佔據很多空間,要清理會很麻煩。但是Docker官方正在試圖解決這個問題,相信以後會有簡便的方法,關於這個問題的進度,現在可以查看這個Pull requests .

這次解決掉了如果apt-get如果不能安裝時,如何在Docker中安裝軟件這個問題.可是關於Docker的學習,隨着深入,月覺得還有很多東西需要了解.以後繼續吧.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章