卷容器與持久化_卷容器與持久化

由於每個容器都有自己用户態的文件系統,所以默認情況下當容器對自己的文件系統進行修改(比如新增文件,修改文件)時,其實修改的是自己容器自己的文件,而不是修改的宿主機的文件系統,所以當容器被刪除後,在容器內增加或者修改的文件也就不見了。

為讓容器內的數據可以被持久化到宿主機上,docker容器提供了數據卷的功能。當容器內需要持久化數據時,可以先在宿主機上創建一個卷(也就是一個文件目錄),然後創建容器時把這個數據卷映射到容器內自己的文件系統目錄內,這樣當容器內添加文件時,其實是把文件添加到了宿主機上,由於卷是在宿主機上的,所以即使容器被刪除了,容器創建的數據還是存在的。


卷容器與持久化_#運維_02

image.png

如上圖,我們在宿主機上創建了一個docker卷,然後我們在創建容器時,就可以把這個數據卷映射到容器內文件系統的code目錄。

我們可以使用下面命令,在宿主機上創建一個名為myvol的數據卷:

$ docker volume create myvol

然後我們可以使用下面命令把myvol這個卷掛載到docker容器的code目錄

$ docker container run -dit --name voltainer \
    --mount source=myvol,target=/code \
    alpine

也就是説用户可以在宿主機上先創建卷,然後在創建容器時將卷掛載到容器上。數據卷會被掛載到容器文件系統的某個目錄之下,任何寫到該目錄下的內容都會寫到卷中。即使容器被刪除,卷與其上面的數據仍然存在。

其實我們可以把卷到容器文件的映射比作實際的文件目錄和軟連接的之間的關係,當我們建立一個軟連接後,我們可以通過軟連接讀寫具體文件目錄的內容,但是當我們刪除軟連接時,並不會刪除實際的文件目錄。也就是容器中的文件和卷各自擁有獨立的生命週期,另外Docker不允許刪除正在被容器使用的卷。