您好,登錄后才能下訂單哦!
Docker 為容器提供了兩種存放數據的資源:
docker的鏡像分層結構,如下所示:
Docker鏡像中引入層layer的概念,鏡像的制作過程中的每一步擦歐總,都會生成一個新的鏡像層
容器由最上面一個可寫的容器層,以及若干只讀的鏡像層組成,容器的數據就存放在這些層中。這樣的分層結構最大的特性是 Copy-on-Write:
Docker info
可查看當前系統使用的Storage driver
centos默認的driver用的是overlay2,底層的文件系統是xfs,各層數據存放在/var/lib/docker
對于某些容器如busybox只是個工具箱,不需要保存數據以后使用,使用完成后直接退出,容器刪除時存放在容器層中的工作數據也一起被刪除。
docker容器中持久化數據一般采用兩種存儲方式:
volume
bind mount
無論是volume還是bind mount,其本質上是宿主機文件系統中的目錄或者文件
無論是volume還是bind mount,其上存放的數據生命周期對立于容器,即容器刪除之后,volume或者bind mount上的數據,依舊存在
Volume 本質上是 Docker Host 文件系統中的目錄或文件,能夠直接被 mount 到容器的文件系統中。Volume 有以下特點:
因為 volume 實際上是 docker host 文件系統的一部分,所以 volume 的容量取決于文件系統當前未使用的空間。
volume使用注意事項:
bind mount 是將 host 上已存在的目錄或文件 mount 到容器。
bind mount實際上是一個inode替換的過程。
bind mount機制主要作用,允許一個目錄或者文件(不是整個設備)掛載到一個指定的目錄上,而且在該掛載點上進行任何的操作,只是發生在被掛載的目錄或者文件上,而原掛載點的內容則會被隱藏起來不受影響。
bind mount使用注意事項:
bind mount的用法是使用-v選項將host已經存在的目錄或者文件mount到容器
如下所示:
-v 的格式為 <host path>:<container path>。/usr/local/apache2/htdocs 就是 apache server 存放靜態文件的地方。由于 /usr/local/apache2/htdocs 已經存在,原有數據會被隱藏起來,取而代之的是 host $HOME/htdocs/ 中的數據,這與 linux mount 命令的行為是一致的。
數據共享是volume的關鍵特性,主機與容器數據共享:
volume container是專門為其他容器提供volume的容器。
因為 volume 實際上是 host 文件系統中的目錄和文件,所以 volume 的備份實際上是對文件系統的備份
volume 的恢復也很簡單,如果數據損壞了,直接用之前備份的數據拷貝
如果使用更新版本的 Registry,這就涉及到數據遷移,方法是:
volume刪除后數據是找不回來的,注意
docker 不會銷毀 bind mount,刪除數據的工作只能由 host 負責,再在執行 docker rm 刪除容器時可以帶上 -v 參數,docker 會將容器使用到的 volume 一并刪除,但前提是沒有其他容器 mount 該 volume。
創建一個卷,并掛載一個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存放靜態文件的地方,
由于 /usr/local/apache2/htdocs 已經存在,原有數據會被隱藏起來,取而代之的是 host $HOME/htdocs/ 中的數據。
檢查volume信息
docker volume ls
查看容器的volume掛載信息,同時得到volume路徑,Type=volume
docker inspect d5db6a048612
查看volume中的數據
cd /var/lib/docker/volumes/6189c90831d019229a2e8593453fe1c334faec1fcc56db80b9f99773d21c9c55/_data
查看容器中相應的數據,結果:容器中的數據=volume中數據
進入容器更新index.html文件內容
docker exec -it d5db6a048612 bash
cd htdocs && echo "update the index" > index.html
再次查看volume中的內容,已經同步跟新
由此實現容器和Host的數據共享。
強制刪除容器,然后查看volume中的數據,可以看到依舊存在
docker rm -f d5db6a048612
將宿主機的/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文件數據,印證httpd1容器中的數據也一起跟新
由此 ,容器和Host的實現了數據共享
進入httpd1容器中更新index.html文件數據,提示Read-only
將宿主機/root/htdocs掛載給名為httpd2的http容器,映射端口8082,不設置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中的數據,三者數據一致
此時印證容器間的數據實現共享
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。