Docker 學習筆記 (四) 數據管理

在默認狀況下,容器內全部文件都存儲在可寫容器層中,這意味着:nginx

  • 當該容器再也不存在時,數據不會持久存在,而且若是另外一個容器須要數據,則可能很難從容器中獲取數據。
  • 容器的可寫層緊密耦合到運行容器的主機。沒法輕鬆地將數據移動到其餘位置。
  • 寫入容器的可寫層須要 存儲驅動程序來管理文件系統。存儲驅動程序使用Linux內核提供聯合文件系統。與使用直接寫入主機文件系統的數據卷相比,這種額外的抽象下降了性能 。

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

Volumes的特色

卷是在Docker容器和服務中持久保存數據的首選方法。卷的一些用例包括:進程

  • 在多個運行容器之間共享數據。若是未顯式建立它,則會在第一次將其裝入容器時建立卷。當該容器中止或被移除時,該卷仍然存在。多個容器能夠同時安裝相同的卷,能夠是讀寫也能夠是隻讀。僅在您明確刪除卷時纔會刪除卷。內存

    當Docker主機不能保證具備給定的目錄或文件結構時。卷可幫助您將Docker主機的配置與容器運行時分離。開發

  • 若是要將容器的數據存儲在遠程主機或雲提供程序上,而不是本地存儲。

  • 當您須要將數據從一個Docker主機備份,還原或遷移到另外一個Docker主機時,卷是更好的選擇。您可使用卷中止容器,而後備份卷的目錄(例如/var/lib/docker/volumes/ )。

Bind mounts的特色

  • 將配置文件從主機共享到容器。這就是Docker默認經過/etc/resolv.conf從主機安裝到每一個容器中來爲容器提供DNS解析的方式 。

  • 在Docker主機上的開發環境和容器之間共享源代碼或構建工件。例如,您能夠將Maven target/ 目錄掛載到容器中,每次在Docker主機上構建Maven項目時,容器均可以訪問重建的工件。

    若是以這種方式使用Docker進行開發,您的生產Dockerfile會將生產就緒工件直接複製到映像中,而不是依賴於綁定裝載。

  • 當Docker主機的文件或目錄結構保證與容器所需的綁定安裝一致時。

tmpfs

  • tmpfs 不但願數據在主機或容器內持久存在時,最好使用掛載。這多是出於安全緣由,或者在應用程序須要編寫大量非持久狀態數據時保護容器的性能。

Volumes和Bind mounts須要注意

  • 若是將空卷裝入容器中存在文件或目錄的目錄中,則會將這些文件或目錄傳播(複製)到卷中。一樣,若是啓動容器並指定尚不存在的卷,則會爲您建立一個空卷。這是預先填充另外一個容器所需數據的好方法。

  • 若是將綁定裝載或非空卷裝入容器中存在某些文件或目錄的目錄中,則裝載會遮蓋這些文件或目錄,就像將文件保存到/mntLinux主機上而後安裝USB驅動器進入/mnt。/mnt在卸載USB驅動器以前,USB驅動器的內容會遮擋內容。隱藏的文件不會被刪除或更改,但在安裝綁定裝載或卷時沒法訪問。

數據卷(Volumes)

數據卷 是一個可供一個或多個容器使用的特殊目錄,它繞過 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 中能夠掛載多個 數據卷。

-v或--mount的區別:

若是要指定數據卷的選項,則必須使用--mount。

  • -v或--volume:由三個字段組成,用冒號字符(:)分隔。字段必須按正確的順序排列,而且每一個字段的含義不是很明顯。
    • 對於命名卷,第一個字段是卷的名稱,而且在給定主機上是惟一的。對於匿名卷,省略第一個字段。
    • 第二個字段是文件或目錄在容器中安裝的路徑。
    • 第三個字段是可選的,是逗號分隔的選項列表,例如ro。這些選項將在下面討論。
  • --mount:由多個鍵值對組成,以逗號分隔,每一個鍵 = 組由一個元組組成。該--mount語法比更詳細的-v或--volume,但按鍵的順序並不顯著,而且標誌的價值更容易理解。

    • type是掛載類型,能夠是bind,volume,或 tmpfs。本主題討論卷,所以掛載類型始終是volume。
    • source,對於命名卷,這是卷的名稱。對於匿名卷,省略此字段。能夠指定爲source 或src。
    • destination 文件或目錄在容器中的路徑。能夠指定爲destination,dst或target。
    • readonly(若是存在)致使綁定裝入以只讀方式裝入容器中。
    • volume-opt 選項能夠屢次指定,它採用由選項名稱及其值組成的鍵值對。

注意:若是啓動的容器不存在掛載卷的路徑,Docker會自動建立。

  • -v
$ docker run -d \
  --name devtest \
  -v myvol2:/app \
  nginx:latest
  • --mount
$ docker run -d \
  --name devtest \
  --mount source=myvol2,target=/app \
  nginx:latest

刪除數據卷

刪除容器後,Docker數據卷仍然存在。

  • 例如,命名卷:具備來自容器外部的特定源awesome:/bar
  • 匿名卷沒有特定的源,所以在刪除容器時,能夠用--rm指令刪除。

刪除匿名卷

要自動刪除匿名卷,須要使用--rm選項。例如,建立匿名/foo卷。刪除容器後,Docker守護進程會刪除/foo卷但不會刪除awesome卷。

docker run --rm -v /foo -v awesome:/bar busybox top

刪除全部未使用的數據卷並釋放空間:

docker volume prune
相關文章
相關標籤/搜索