Docker Volume

Federico發表於2017-12-12

Docker資料卷

概念

  Volume是存在於一個或多個容器中的特定檔案或資料夾,這個目錄能夠以獨立於聯合檔案系統的形式在宿主機中存在,併為資料的共享與持久化提供一下便利:

  • Volume在容器建立時就會初始化,在容器執行時就可以使用其中的檔案。
  • Volume能在不同的容器之間共享和重用。
  • 對Volume中的資料操作會馬上生效。
  • 對Volume中資料的操作不會影響到映象本身。
  • Volume的生存週期獨立於容器的生存週期,即使刪除容器,Volume仍然會存在,沒有任何容器使用的Volume也不會被Docker刪除。

使用

  Volume類似於linux的mount操作,使用者將一個資料夾作為Volume掛載到容器上,可以很方便的將資料新增到容器中提供其中的程式使用。多個容器可以共享同一個Volume,為不同容器之間的資料共享提供了便利。

從容器掛載Volume

  在使用docker run或docker create命令建立容器時,可以使用-v標籤為容器新增Volume。
docker run -itd --name redis-master -v /data centos bash
  在建立容器時,會將容器中的/data目錄作為一個Volume掛載點。可以使用docker inspect -f {{.Volumes}} redis-slave命令來檢視該容器卷在宿主機的位置:

map[/data:/var/lib/docker/volumes/fea37bc27b3ea5111f115502d539415b9d7744ae0356e43ba062f1272d825c0d/_data]

接下來來驗證下:
cp unstable.tar.gz /var/lib/docker/volumes/fea37bc27b3ea5111f115502d539415b9d7744ae0356e43ba062f1272d825c0d/_data

docker exec -it redis-slave bash

ls /data/

unstable.tar.gz

從宿主機掛載Volume

  建立新容器的時候掛載一個主機上的特定目錄到容器中
docker run -itd --name redis-slave -v /data/package:/data/apps centos /bin/bash
  將宿主機中的/data/package目錄資料夾作為一個Volume掛載到容器中的/data/apps下。
掛載映象時可以指定掛載許可權/data/package:/data/apps:ro

使用Dockerfile新增Volume

使用VOLUME指令向容器新增Volume:
VOLUME /data
VOLUME ["/data1","/data2"]:新增多個Volume
  在執行docker build命令時會生成映象並且以此映象啟動一個容器時會掛載一個Volume到/data。但是和docker run -v 不同的是,VOLUME指令不能掛載主機指定資料夾,這是因為我們要保證Dockerfile的可移植性,我們不能確保每個使用此Dockerfile的宿主機都有對應這個資料夾。

共享Volume

在使用docker run/create命令建立新容器時,可以使用--volume-from標籤使得容器與已有的容器共享Volume。
docker run -itd --name mysql --volume-from redis-master centos /bin/bash
  新建立的容器mysql與原容器redis-master共享Volume,也就是說此時redis-master擁有的Volume同樣會掛載到mysql上。
可以使用多個--volume-from使容器與多個已有容器共享Volume

刪除Volume

如果建立容器時在容器中掛載了Volume,在/var/lib/docker/vfs/dir下會生成與Volume對應的目錄,使用docker rm 刪除容器並不會刪除與Volume對應的目錄,這些目錄會佔據不必要的儲存空間,即便可以手動刪除,也非常麻煩,所以在刪除容器時需要對容器的Volume進行妥善處理。

再刪除容器時同時刪除Volume有以下兩種方法:

  • docker rm -v
  • 執行容器時使用docker run --rm--rm標籤會在容器停止執行時刪除容器及容器所掛載的Volume。

當然如果是從宿主機掛載的Volume,無論對容器進行任何操作都不會導致其在宿主機上被刪除,如果不需要這些檔案了,只能手動刪除它們。

相關文章