在默認狀況下,容器內全部文件都存儲在可寫容器層中,這意味着:nginx
Docker有兩個容器選項能夠在主機中存儲文件,所以即便在容器中止以後文件仍然會存在:volumes和 bind mounts。在Linux上運行Docker,可使用tmpfs mount臨時掛載。docker
不管哪一種方式,數據在容器內都是相同的。它做爲目錄或容器文件系統中的單個文件公開。安全
Volumes,Bind mounts和tmpfs 裝載之間差別的簡單方法是考慮數據在Docker主機上的位置。app
Volumes存儲在由Docker(/var/lib/docker/volumes/在Linux上)管理的主機文件系統的一部分中。非Docker進程不該修改文件系統的這一部分。卷是在Docker中保留數據的最佳方式。性能
Bind mounts能夠存儲在主機系統的任何位置。它們甚至多是重要的系統文件或目錄。Docker主機或Docker容器上的非Docker進程能夠隨時修改它們。code
tmpfs掛載僅存儲在主機系統的內存中,永遠不會寫入主機系統的文件系統。blog
卷是在Docker容器和服務中持久保存數據的首選方法。卷的一些用例包括:進程
在多個運行容器之間共享數據。若是未顯式建立它,則會在第一次將其裝入容器時建立卷。當該容器中止或被移除時,該卷仍然存在。多個容器能夠同時安裝相同的卷,能夠是讀寫也能夠是隻讀。僅在您明確刪除卷時纔會刪除卷。內存
當Docker主機不能保證具備給定的目錄或文件結構時。卷可幫助您將Docker主機的配置與容器運行時分離。開發
若是要將容器的數據存儲在遠程主機或雲提供程序上,而不是本地存儲。
當您須要將數據從一個Docker主機備份,還原或遷移到另外一個Docker主機時,卷是更好的選擇。您可使用卷中止容器,而後備份卷的目錄(例如/var/lib/docker/volumes/
將配置文件從主機共享到容器。這就是Docker默認經過/etc/resolv.conf從主機安裝到每一個容器中來爲容器提供DNS解析的方式 。
在Docker主機上的開發環境和容器之間共享源代碼或構建工件。例如,您能夠將Maven target/ 目錄掛載到容器中,每次在Docker主機上構建Maven項目時,容器均可以訪問重建的工件。
若是以這種方式使用Docker進行開發,您的生產Dockerfile會將生產就緒工件直接複製到映像中,而不是依賴於綁定裝載。
當Docker主機的文件或目錄結構保證與容器所需的綁定安裝一致時。
若是將空卷裝入容器中存在文件或目錄的目錄中,則會將這些文件或目錄傳播(複製)到卷中。一樣,若是啓動容器並指定尚不存在的卷,則會爲您建立一個空卷。這是預先填充另外一個容器所需數據的好方法。
若是將綁定裝載或非空卷裝入容器中存在某些文件或目錄的目錄中,則裝載會遮蓋這些文件或目錄,就像將文件保存到/mntLinux主機上而後安裝USB驅動器進入/mnt。/mnt在卸載USB驅動器以前,USB驅動器的內容會遮擋內容。隱藏的文件不會被刪除或更改,但在安裝綁定裝載或卷時沒法訪問。
數據卷 是一個可供一個或多個容器使用的特殊目錄,它繞過 UFS,能夠提供不少有用的特性:
數據卷 能夠在容器之間共享和重用
對 數據卷 的修改會立馬生效
對 數據卷 的更新,不會影響鏡像
數據卷 默認會一直存在,即便容器被刪除
注意:數據卷 的使用,相似於 Linux 下對目錄或文件進行 mount,鏡像中的被指定爲掛載點的目錄中的文件會隱藏掉,能顯示看的是掛載的 數據卷。
$ docker volume create my-vol
$ docker volume ls DRIVER VOLUME NAME local my-vol
$ docker volume inspect my-vol [ { "CreatedAt": "2019-05-19T08:22:09Z", "Driver": "local", "Labels": null, "Mountpoint": "/var/lib/docker/volumes/my-vol/_data", "Name": "my-vol", "Options": null, "Scope": "local" } ]
在用 docker run 命令的時候,使用 -v和--mount 標記來將 數據卷 掛載到容器裏。在一次 docker run 中能夠掛載多個 數據卷。
若是要指定數據卷的選項,則必須使用--mount。
--mount:由多個鍵值對組成,以逗號分隔,每一個鍵
注意:若是啓動的容器不存在掛載卷的路徑,Docker會自動建立。
$ docker run -d \ --name devtest \ -v myvol2:/app \ nginx:latest
$ docker run -d \ --name devtest \ --mount source=myvol2,target=/app \ nginx:latest
刪除容器後,Docker數據卷仍然存在。
要自動刪除匿名卷,須要使用--rm選項。例如,建立匿名/foo卷。刪除容器後,Docker守護進程會刪除/foo卷但不會刪除awesome卷。
docker run --rm -v /foo -v awesome:/bar busybox top
docker volume prune