Dcoker 入門之存儲卷

Dcoker 入門之存儲卷

首發:arppinging.comhtml

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

Docker 入門之存儲卷

1、Docker中的文件

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

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

通俗來說:容器是分層的,最上面一層是可讀寫層,對全部數據的修改,都是保存在最上層的;在運行容器以後,全部的操做都不會影響到鏡像自己,若是是編輯操做,那麼docker只會從只讀層將文件複製(非移動)到讀寫層給用戶進行編輯。spa

docker中的文件docker中的文件

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

1)存在的問題

一、當用戶關閉和重啓容器時,容器中的數據不受影響,但刪除容器,則其數據會所有丟失。3d

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

三、容器間數據共享不便regexp

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

2)解決方案

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

目錄綁定目錄綁定

3、什麼是docker存儲卷?

1)概述

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

2)卷(volume)的特色

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

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

三、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定義

4、使用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]# 
相關文章
相關標籤/搜索