1. 程式人生 > >自己學Docker:5.Docker的資料持久化之資料卷

自己學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的學習,隨著深入,月覺得還有很多東西需要了解.以後繼續吧.