在前一篇文章中我們有說明到,在容器中不管做了什麼改變,如果沒有執行docker container commit的話,做過的改變就不會被保存下來。然而,有時候我們想要保存的不是整個容器的執行狀態,而是處理過的資料,那麼Volume就是用來解決這種情境的。
要在不同的容器間或是每一次執行容器時都可以存取到相同的資料,以及要創建一個地方可以儲存操作過的資料,請使用以下的指令創建一個volume:
docker volume create <volume-name>
創建完畢之後,即可利用docker volume ls列出所有目前系統上的Volume,操作過程如下所示:
有了這個叫做datavol的Volume之後,下次再執行容器時就可以利用「-v」把這個容器帶上,也就是把它掛載到容器中的指定資料夾中,如下所示(在這個指令中使用了上一篇文章中commit的映像檔,你也可以利用現有的映像檔來代替,例如ubuntu/apache2):
docker run -it -v datavol:/data myapache2 bash
上述的指令執行之後,在myapach2的執行環境中執行「ls」,就可以看到多出了一個叫做data的資料夾,如下所示:
我們可以在這個資料夾中新增任何的資料,所有新增的資料都會被放置在datavol這個Volume中,只要這個Volume在系統中存在,則就算是離開了容器,下次再使用別的容器掛載這個Volume,仍然可以看到相同的資料,如此就可以達到資料永久保存的目的了。請參考以下的操作:
在上面這個過程中,我們示範了進入myapache2這個容器,創建了一個叫做test.txt的文字檔案然後離開容器,接著利用另外一個叫做python的容器掛載相同的datavol也是放到data資料夾中,進入python容器中後,同樣地可以看到test.txt這個檔案。
有一點要特別留意的是,volume在使用之前並不一定要明顯地創建,如果你沒有自行創建一個volume,而是直接在進入容器時做也掛載的指定,則Docker系統會自動幫你創建一個新的volume並掛載上去,因此,在輸入掛載的volume名稱時要小心不要打錯了,不然會多創建了一個不需要的volume。
除了掛載volume到容器中之外,我們也可以指定本地端主機的目錄,直接不透過Volume而讓容器存在主機上的目錄,讓資料保留在我們指定的檔案中,以Windows的作業系統為例,請參考以下的指令:
docker run -it -v //c/data:/data python bash
上述指令會讓我們在容器的data資料夾中,操作主機C磁碟機的data目錄。