一開始,認為Volume是用來持久化的,但是這實際上不對,因為認為Volume是用來持久化的同學一定是認為容器無法持久化,所以有了Volume來幫助容器持久化,事實上,容器會一直存在,除非你刪除他們.
容器是持久的,直到你刪除他們,並且你只能這么做:
- $docker rm my_contariner
如果你沒有執行此命令,那么你的容器會一直存在,依舊可以啟動,停止等.如果你找不到容器,可以運行
- $docker ps -a
Docker ps只能顯示正在運行的容器,但是容器也會處於停止狀態,這種情況下,上面的命令會顯示所有的容器,無論他們處於什么狀態.docker run...命令可以有很多的組合(它提供了Docker容器從創建到啟動的所有功能),它會創建一個新的容器,然后啟動它.
所以說,Volume不是為了持久化.
什么是Voume
Volume可以將容器以及容器纏身的數據分離開來,這樣的話,當你使用docker rm my_container刪除容器時,不會影響相關的數據.
Volume可以使用下面兩種方式創建:
1.在Dockerfile指定VOLUME /some/dir
2.執行docker run -v /some/dir命令指定
無論哪種方式都是做了同樣的事情.他們告訴Docker在主機上創建一個目錄(默認情況下是在/var/lib/docker),然后將其掛載到指定的路徑(本例中是:/some/dir).當刪除使用該Volume的容器時,Volume本身不會受到影響,它可以一直存在下去.
如果在容器中不存在指定的目錄,那么該目錄將會被自動創建.
你可以告訴Docker同時刪除容器和Volume:
- $docker rm -v my_container
有時候,你想在容器中使用主機上的某個目錄,你可以通過其他的參數來指定:
- $docker run -v /host/path:/some/path...
這就明確的告訴Docker使用指定的主機路徑來代替Docker床架你的根路徑並掛載到容器內指定的路徑(上例中是/some/dir).需要注意的是,這種方式同樣支持問文件.在Docker術語中,這通常被稱為bind-mounts.如果主機上的路徑不存在,目錄將自動在給定的路徑中創建.
容器也可以與其他容器共享Volume:
- $docker run --name my_container -v /some/path ...
- $docker run --volumes-from my_container --name my_contaner2 ...
如果你執行docker rm -v my_container命令,而上面的第二容器依然存在,那Volume就不會刪除,如果你不使用docker rm -v my_container2刪除第二個容器,那么這個Volume就是一直存在.
繼續補充,因為VOLUME實際上就是在本地新建了一個文件夾掛載了,那么實際上容器內部的文件夾有三種情況:
1、沒有指定VOLUME也沒有指定-v,這種是普通文件夾。
2、指定了VOLUME沒有指定-v,這種文件夾可以在不同容器之間共享,但是無法在本地修改。
3、指定了-v的文件夾,這種文件夾可以在不同容器之間共享,且可以在本地修改。
