Dcoker 入門之存儲卷

Dcoker 入門之存儲卷

首發:arppinging.com

Docker 入門之存儲卷一、Docker中的文件二、存在的問題和解決方案1)存在的問題2)解決方案三、什麼是docker存儲卷?1)概述2)卷(volume)的特點3)卷的類型(volume types)四、使用docker存儲卷(volume)1)docker-managed volume2)bind mount volume3)複製使用其他容器的卷

Docker 入門之存儲卷

一、Docker中的文件

首先我們需要回顧一下之前的內容:
1、docker鏡像由多個層疊加而成,啓動容器時,docker會加載只讀鏡像層,並在鏡像棧頂部添加一個讀寫層。

2、如果運行中的容器修改了現有的一個已經存在的文件,那該文件會從只讀層複製到讀寫層,該文件的只讀版本仍然存在,只是已經被讀寫層中該文件的副本所隱藏,此即“寫時複製(COW)”機制。

通俗來講:容器是分層的,最上面一層是可讀寫層,對所有數據的修改,都是保存在最上層的;在運行容器之後,所有的操作都不會影響到鏡像本身,如果是編輯操作,那麼docker只會從只讀層將文件複製(非移動)到讀寫層給用戶進行編輯。

docker中的文件docker中的文件

二、存在的問題和解決方案

1)存在的問題

1、當用戶關閉和重啓容器時,容器中的數據不受影響,但刪除容器,則其數據會全部丟失。

2、數據存儲在聯合文件系統中,不易於宿主機訪問。

3、容器間數據共享不便

4、容器寫入和更改數據效率低,部分文件需要從底層複製,不適合IO較高的應用。

2)解決方案

“卷”是容器一個或多個“目錄”,此次類目錄可繞過聯合文件系統,於宿主機上的目錄“綁定(關聯)”

目錄綁定目錄綁定

三、什麼是docker存儲卷?

1)概述

將宿主機的目錄直接於容器中的目錄進行綁定,容器向目錄寫入數據時,可以直接寫入宿主機的目錄中。這樣容器內的數據保存時就能繞過容器內部文件系統的限制,與宿主機的文件系統建立關聯關係,實現數據共享,容器被停止或者刪除時,數據不會丟失。

2)卷(volume)的特點

1、volume於容器初始化之時即會創建,由base image提供的卷中的數據會在此期間完成複製。(例:將宿主機上/data/docker/b1 和 容器b1中的/etc/綁定,那麼會將容器中/etc/的內容複製到宿主機/dta/docker/b1/目錄中)

2、volume的初衷是獨立於容器的生命週期實現數據持久化,因此刪除容器之時即不會刪除卷,也不會對哪怕未被引用的卷做垃圾回收操作。

3、volume爲docker提供了獨立於容器的數據管理機制
(可以把”鏡像“想象爲靜態文件,例如”程序“,把”卷“類比爲動態內容,例如”數據“;於是,鏡像可以被重用,而卷可以被共享;卷實現了”程序(鏡像)“和”數據(卷)“的分離,用戶製作鏡像時無需再考慮鏡像運行的容器所在的環境)

docker 卷docker 卷

3)卷的類型(volume types)

docker 有兩種類型的卷,每種類型都在容器中存在一個掛載點,但其在宿主機上的位置有所不同

3.1 bind mount volume(綁定掛載卷)

a volume that points to a user-specified location on the host file system

3.2 docker-manged volume(docker 管理卷)

the docker daemon creates managed volumes in a portion of the host's file system that's system that's owned by docker

兩種類型的卷兩種類型的卷

bind mount volume:指定綁定的路徑

docker-managed volume:宿主機的路徑由docker daemon定義

四、使用docker存儲卷(volume)

無論是哪種類型的卷,都使用docker run的-v參數。

1)docker-managed volume

1.1 創建容器b1,指定b1的/data/目錄使用存儲卷

[root@localhost ~]# docker run --name b1 -it -v /data busybox
/ # cd /data/
/data # ls
/data 

1.2 查看關聯的宿主機目錄

[root@localhost b1]# docker inspect -f {{.Mounts}} b1
[{volume 4e1f3596768357e009da8df6d38c4339df04b64dee2d80e262609f83b87d4177 /var/lib/docker/volumes/4e1f3596768357e009da8df6d38c4339df04b64dee2d80e262609f83b87d4177/_data /data local  true }]
[root@localhost b1]

1.3 在宿主機目錄中寫入文件

[root@localhost b1]# cd /var/lib/docker/volumes/4e1f3596768357e009da8df6d38c4339df04b64dee2d80e262609f83b87d4177/_data/
[root@localhost _data]# echo 'welcome to arppinging.com' >> test.txt
[root@localhost _data]# cat test.txt 
welcome to arppinging.com
[root@localhost _data]

1.4 在容器b1中查看是否有test.txt文件

/data # cat /data/test.txt 
welcome to arppinging.com
/data 

2)bind mount volume

使用綁定掛載卷的時候,如果宿主機的目錄不存在,那麼會自動創建該目錄。

1.1 創建容器b2,配置宿主機的/data/docker/b2/與容器b2的/data/關聯

[root@localhost ~]# docker run --name b2 -it -v /data/docker/b2:/data busybox
/ # ls /data/

1.2 查看b2的關聯目錄

[root@localhost _data]# docker inspect -f {{.Mounts}} b2
[{bind  /data/docker/b2 /data   true rprivate}]
[root@localhost _data]

1.3 在b2的/data/中創建一個文件,

/ # cd /data/
/data # echo 'welcome to b2.arppinging.com' > b2.html
/data # 

1.4 在宿主機的/data/docker/b2中是否能看到b2創建的文件?

[root@localhost /]# cd /data/docker/b2/
[root@localhost b2]# ls
b2.html
[root@localhost b2]# cat b2.html 
welcome to b2.arppinging.com
[root@localhost b2]

1.5 刪除容器b2,查看宿主機的目錄文件是否還存在

[root@localhost ~]# docker rm b2
b2
[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
ec2ff6aeb48a        busybox             "sh"                10 minutes ago      Exited (04 minutes ago                       b1
[root@localhost ~]
[root@localhost ~]# cd /data/docker/b2/
[root@localhost b2]# cat b2.html 
welcome to b2.arppinging.com
[root@localhost b2]

3)複製使用其他容器的卷

複製和使用其他容器的卷,使用的是--volumes-from選項
創建一個容器b3,使用b1的存儲卷

[root@localhost b2]# docker run --name b3 -it --volumes-from b1 busybox
# cat /data/test.txt 
welcome to arppinging.com

查看映射卷

[root@localhost b2]# docker inspect -f {{.Mounts}} b1
[{volume 4e1f3596768357e009da8df6d38c4339df04b64dee2d80e262609f83b87d4177 /var/lib/docker/volumes/4e1f3596768357e009da8df6d38c4339df04b64dee2d80e262609f83b87d4177/_data /data local  true }]

[root@localhost b2]# docker inspect -f {{.Mounts}} b3
[{volume 4e1f3596768357e009da8df6d38c4339df04b64dee2d80e262609f83b87d4177 /var/lib/docker/volumes/4e1f3596768357e009da8df6d38c4339df04b64dee2d80e262609f83b87d4177/_data /data local  true }]
[root@localhost b2]# 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章