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