Data Volume。

storage driver

docker的鏡像分層結(jié)構(gòu),如下所示:

Docker鏡像中引入層layer的概念,鏡像的制作過程中的每一步擦歐總,都會生成一個新的鏡像層

容器由最上面一個可寫的容器層,以及若干只讀的鏡像層組成,容器的數(shù)據(jù)就存放在這些層中。這樣的分層結(jié)構(gòu)最大的特性是 Copy-on-Write:

新數(shù)據(jù)會直接存放在最上面的容器層。
修改現(xiàn)有數(shù)據(jù)會先從鏡像層將數(shù)據(jù)復制到容器層,修改后的數(shù)據(jù)直接保存在容器層中,鏡像層保持不變。
如果多個層中有命名相同的文件,用戶只能看到最上面那層中的文件。
分層結(jié)構(gòu)使鏡像和容器的創(chuàng)建、共享以及分發(fā)變得非常高效,而這些都要歸功于 Docker storage driver。正是 storage driver 實現(xiàn)了多層數(shù)據(jù)的堆疊并為用戶提供一個單一的合并之后的統(tǒng)一視圖。
Docker 支持多種 storage driver,有 AUFS、Device Mapper、Btrfs、OverlayFS、VFS 和 ZFS。它們都能實現(xiàn)分層的架構(gòu),同時又有各自的特性。
Docker會優(yōu)先使用 Linux 發(fā)行版默認的 storage driver。
Docker 安裝時會根據(jù)當前系統(tǒng)的配置選擇默認的 driver。默認 driver 具有最好的穩(wěn)定性,因為默認 driver 在發(fā)行版上經(jīng)過了嚴格的測試。
運行Docker info可查看當前系統(tǒng)使用的Storage driver

centos默認的driver用的是overlay2,底層的文件系統(tǒng)是xfs,各層數(shù)據(jù)存放在/var/lib/docker

對于某些容器如busybox只是個工具箱,不需要保存數(shù)據(jù)以后使用,使用完成后直接退出,容器刪除時存放在容器層中的工作數(shù)據(jù)也一起被刪除。

Docker數(shù)據(jù)管理

docker容器中持久化數(shù)據(jù)一般采用兩種存儲方式:
volume
bind mount

無論是volume還是bind mount,其本質(zhì)上是宿主機文件系統(tǒng)中的目錄或者文件
無論是volume還是bind mount,其上存放的數(shù)據(jù)生命周期對立于容器,即容器刪除之后,volume或者bind mount上的數(shù)據(jù),依舊存在

Volume

Volume 本質(zhì)上是 Docker Host 文件系統(tǒng)中的目錄或文件,能夠直接被 mount 到容器的文件系統(tǒng)中。Volume 有以下特點:

Volume 是目錄或文件,而非沒有格式化的磁盤(塊設(shè)備)。
容器可以讀寫 volume 中的數(shù)據(jù)。
volume 數(shù)據(jù)可以被永久的保存,即使使用它的容器已經(jīng)銷毀。

因為 volume 實際上是 docker host 文件系統(tǒng)的一部分,所以 volume 的容量取決于文件系統(tǒng)當前未使用的空間。

volume使用注意事項:

volume的內(nèi)容存在容器的生命周期之外;刪除后依舊存在
掛載volume時,不需要指定mount源,指定mount point即可,Docker會在/var/lib/docker/volumes路徑下為每個volume生成一個目錄,作為mount源
若mount point指向容器中已有的目錄,則該目錄下的數(shù)據(jù)會被copy到volume中
若mount point指向容器中的空目錄,則會自動創(chuàng)建所需目錄。
若啟動掛載上不存在的卷的容器,Dokcer會自動創(chuàng)建卷
Volume再使用時,可通過ro參數(shù)將容器戳volume的權(quán)限設(shè)置為只讀

bind mount

bind mount 是將 host 上已存在的目錄或文件 mount 到容器。

bind mount實際上是一個inode替換的過程。

bind mount機制主要作用,允許一個目錄或者文件(不是整個設(shè)備)掛載到一個指定的目錄上,而且在該掛載點上進行任何的操作,只是發(fā)生在被掛載的目錄或者文件上,而原掛載點的內(nèi)容則會被隱藏起來不受影響。

bind mount使用注意事項:

容器運行過程中,對bind mount目錄中改動的數(shù)據(jù),將被保存,刪除容器后,bind mount中的數(shù)據(jù)任然存在。
bind mount可以掛載在一個目錄到容器,也可以掛載一個文件到容器,但必須要指定的目錄或文件的路徑,即mount源,當然也必須指定mount point,這也限制了容器的可移植性
若將bind mount也綁定到容器上的某非空目錄下,則會隱藏容器目錄下的現(xiàn)有內(nèi)容,若不希望容器的整個目錄被覆蓋,可單獨掛載某個文件
若mount源指向的文件或者目錄在宿主機上不存在,則會自動創(chuàng)建
bind mount時,可以通過ro參數(shù)將容器對數(shù)據(jù)的權(quán)限設(shè)置為只讀,設(shè)置ro參數(shù)后,容器無法對數(shù)據(jù)進行修改,但宿主機依舊有權(quán)修改其內(nèi)容。

bind mount的用法是使用-v選項將host已經(jīng)存在的目錄或者文件mount到容器
如下所示:

-v 的格式為 <host path>:<container path>。/usr/local/apache2/htdocs 就是 apache server 存放靜態(tài)文件的地方。由于 /usr/local/apache2/htdocs 已經(jīng)存在,原有數(shù)據(jù)會被隱藏起來,取而代之的是 host $HOME/htdocs/ 中的數(shù)據(jù),這與 linux mount 命令的行為是一致的。

數(shù)據(jù)共享

數(shù)據(jù)共享是volume的關(guān)鍵特性,主機與容器數(shù)據(jù)共享:

bind mount:將host上的目錄或者文件mount到容器中
volume:將Host上的數(shù)據(jù)copy到容器的volume中
容器間的數(shù)據(jù)共享:
bind mount:將host上目錄或文件mount到多個容器中
volume:將volume掛載到多個容器
volume container:先通過volume或bind mount將數(shù)據(jù)掛載到一個container中,其他容器再引用這個container中的數(shù)據(jù)

volume container是專門為其他容器提供volume的容器。

volume生命周期管理
備份

因為 volume 實際上是 host 文件系統(tǒng)中的目錄和文件,所以 volume 的備份實際上是對文件系統(tǒng)的備份

恢復

volume 的恢復也很簡單,如果數(shù)據(jù)損壞了,直接用之前備份的數(shù)據(jù)拷貝

遷移

如果使用更新版本的 Registry,這就涉及到數(shù)據(jù)遷移,方法是:

docker stop 當前 Registry 容器。
啟動新版本容器并 mount 原有 volume。

銷毀

volume刪除后數(shù)據(jù)是找不回來的,注意
docker 不會銷毀 bind mount,刪除數(shù)據(jù)的工作只能由 host 負責,再在執(zhí)行 docker rm 刪除容器時可以帶上 -v 參數(shù),docker 會將容器使用到的 volume 一并刪除,但前提是沒有其他容器 mount 該 volume。

操作實驗
volume掛載操作

創(chuàng)建一個卷,并掛載一個httpd容器
docker run -d -p 8080:80 -v /usr/local/apache2/htdocs httpd
-v 將其mount到httpd容器

-v格式為<host path>:<container path>。/usr/local/apache2/htdocs就是Apache Server存放靜態(tài)文件的地方,
由于 /usr/local/apache2/htdocs 已經(jīng)存在,原有數(shù)據(jù)會被隱藏起來,取而代之的是 host $HOME/htdocs/ 中的數(shù)據(jù)。
檢查volume信息

docker volume ls

查看容器的volume掛載信息,同時得到volume路徑,Type=volume

docker inspect d5db6a048612

查看volume中的數(shù)據(jù)

 cd /var/lib/docker/volumes/6189c90831d019229a2e8593453fe1c334faec1fcc56db80b9f99773d21c9c55/_data

查看容器中相應的數(shù)據(jù),結(jié)果:容器中的數(shù)據(jù)=volume中數(shù)據(jù)

進入容器更新index.html文件內(nèi)容

docker exec -it d5db6a048612 bash
cd htdocs && echo update the index > index.html

再次查看volume中的內(nèi)容,已經(jīng)同步跟新

由此實現(xiàn)容器和Host的數(shù)據(jù)共享。

強制刪除容器,然后查看volume中的數(shù)據(jù),可以看到依舊存在

docker rm -f d5db6a048612

bind mount

將宿主機的/root/htdocs目錄以只讀的方式掛載給一個名為httpd1的httpd容器,映射端口8081

docker run --name httpd1 -d -p 8081:80 -v /root/htdocs:/usr/local/apache2/htdocs:ro httpd

查看容器掛載信息。Type=bind

docker inspect httpd1

在宿主機host上跟新index.html文件數(shù)據(jù),印證httpd1容器中的數(shù)據(jù)也一起跟新

由此 ,容器和Host的實現(xiàn)了數(shù)據(jù)共享

進入httpd1容器中更新index.html文件數(shù)據(jù),提示Read-only

將宿主機/root/htdocs掛載給名為httpd2的http容器,映射端口8082,不設(shè)置ro

docker run --name httpd2 -d -p 8082:80 -v /root/htdocs/:/usr/local/apache2/htdocs httpd

進入httpd2容器中更新index.html

docker exec -it httpd2 bash

分別查看宿主機、http1,http2中的數(shù)據(jù),三者數(shù)據(jù)一致

此時印證容器間的數(shù)據(jù)實現(xiàn)共享

更多關(guān)于云服務器,域名注冊,虛擬主機的問題,請訪問三五互聯(lián)官網(wǎng):www.shinetop.cn

贊(0)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享網(wǎng)絡(luò)內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。郵箱:3140448839@qq.com。本站原創(chuàng)內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明出處:三五互聯(lián)知識庫 » Docker學習-Docker存儲

登錄

找回密碼

注冊