偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

【Docker進(jìn)階】從五方面深入理解Docker Volume 的工作原理

云計(jì)算
本文主要介紹了Docker Volume的作用機(jī)制,是Docker入門教程的延伸, 作者通過從數(shù)據(jù)的共享、數(shù)據(jù)容器、備份、權(quán)限以及刪除Volumes五方面深入介紹了Volumes的工作原理。

從Docker IRC(網(wǎng)絡(luò)即時(shí)聊天)頻道以及stackoverflow(譯者注:有關(guān)代碼問題的問答平臺:大部分代碼exception問題可以復(fù)制->粘貼->搜索來找到答案)的問題來看,Docker volumes是如何工作的這個(gè)問題上還存在很多混淆。在這篇文章中我會盡最大努力來解釋Volumes是如何工作的,并展示一些最佳實(shí)踐。雖然這篇文章主要是針對泊塢窗的用戶幾乎沒有的知識量,盡管這篇文章主要是針對那些對Volumes不了解的Docker用戶,當(dāng)然有經(jīng)驗(yàn)的用戶也可以學(xué)一些Volumes的很多人不知道的細(xì)微之處的知識。

為了了解什么是Docker Volume,首先我們需要明確Docker內(nèi)的文件系統(tǒng)是如何工作的。Docker鏡像被存儲在一系列的只讀層。當(dāng)我們開啟一個(gè)容器,Docker讀取只讀鏡像并添加一個(gè)讀寫層在頂部。如果正在運(yùn)行的容器修改了現(xiàn)有的文件,該文件將被拷貝出底層的只讀層到最頂層的讀寫層。在讀寫層中的舊版本文件隱藏于該文件之下,但并沒有被不破壞 - 它仍然存在于鏡像以下。當(dāng)Docker的容器被刪除,然后重新啟動(dòng)鏡像時(shí),將開啟一個(gè)沒有任何更改的新的容器 - 這些更改會丟失。此只讀層及在頂部的讀寫層的組合被Docker稱為Union File System(聯(lián)合文件系統(tǒng))。

為了能夠保存(持久)數(shù)據(jù)以及共享容器間的數(shù)據(jù),Docker提出了Volumes的概念。很簡單,volumes是目錄(或者文件),它們是外部默認(rèn)的聯(lián)合文件系統(tǒng)或者是存在于宿主文件系統(tǒng)正常的目錄和文件。

初始化Volumes有兩種方式,對于理解來說一些細(xì)微的差別很重要。我們可以用在運(yùn)行時(shí)使用-v來聲明

Volumes:

  1. $ docker run -it --name container-test -h CONTAINER -v /data debian /bin/bash root@CONTAINER:/# ls /data 
  2. root@CONTAINER:/# 

這將在容器內(nèi)創(chuàng)建路徑/data,它存在于聯(lián)合文件系統(tǒng)外部并可以在主機(jī)上直接訪問。任何在該鏡像/data路徑的文件將被復(fù)制到volume。我們可以使用docker inspect命令找出Volume在主機(jī)存儲的地方:

  1. $ docker inspect -f {{.Volumes}} container-test 

你會看到以下類似內(nèi)容:

  1. map[/data:/var/lib/docker/vfs/dir/cde167197ccc3e138a14f1a4f...b32cec92e79059437a9] 

這說明Docker把在/var/lib/docker下的某個(gè)目錄掛載到了容器內(nèi)的/data目錄下。讓我們從主機(jī)上添加文件到此文件夾下:

  1. $ sudo touch /var/lib/docker/vfs/dir/cde167197ccc3e13814f...b32ce9059437a9/test-file 

進(jìn)入我們的容器內(nèi)可以看到:

  1. $ root@CONTAINER:/# ls /data test-file 

改變會立即生效只要將主機(jī)的目錄掛載到容器的目錄上。我們可以在Dockerfile中通過使用VOLUME指令來達(dá)到相同的效果:

  1. FROM debian:wheezy VOLUME /data 

但還有另一件只有-v標(biāo)志能做到而Dockerfile是做不到的事是在容器上掛載指定的主機(jī)目錄。例如:

  1. $ docker run -v /home/adrian/data:/data debian ls /data 

該命令將掛載主機(jī)的/home/adrian/data目錄到容器內(nèi)的/data目錄上。任何在/home/adrian/data目錄的文件都將會出現(xiàn)在容器內(nèi)。對于在主機(jī)和容器之間共享文件這是非常有幫助的,例如掛載需要編譯的源代碼。為了保存可移植性(并不是所有的系統(tǒng)的主機(jī)目錄都是可以用的),掛載主機(jī)目錄不用從Dockerfile指定。當(dāng)使用-v參數(shù)的形式時(shí)并不鏡像目錄下的所有文件都被復(fù)制進(jìn)Volume中。

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

從一個(gè)容器訪問另一個(gè)容器的volumes,我們只用使用-volumes-from參數(shù)來執(zhí)行docker run。

  1. $ docker run -it -h NEWCONTAINER --volumes-from container-test debian /bin/bash root@NEWCONTAINER:/# ls /data 
  2. test-file 
  3. root@NEWCONTAINER:/# 

值得注意的是不管container-test運(yùn)沒運(yùn)行,它都會起作用。Volume直到容器沒有連接到它才會被刪除。

數(shù)據(jù)容器

使用純數(shù)據(jù)容器來持久數(shù)據(jù)庫、配置文件或者數(shù)據(jù)文件等等是普遍的做法。官方的文檔就講解的不錯(cuò)。例如:

  1. $ docker run --name dbdata postgres echo "Data-only container for postgres" 

該命令將會創(chuàng)建一個(gè)包含已經(jīng)在Dockerfile里定義過Volume的postgres鏡像,運(yùn)行echo命令然后退出。當(dāng)我們運(yùn)行docker ps命令時(shí),echo是有用的作為我們識別某鏡像的用途。我們可以用-volumes-from命令使用其他容器的Volume:

  1. $ docker run -d --volumes-from dbdata --name db1 postgres 

使用數(shù)據(jù)容器兩個(gè)要點(diǎn):

  • 不要不管運(yùn)行中的數(shù)據(jù)容器,這是無意義的浪費(fèi)資源
  • 不要為了數(shù)據(jù)容器來使用“最小的鏡像”如busybox或scratch。只要使用數(shù)據(jù)庫鏡像本身就可以了。如果你已經(jīng)有了該鏡像,那么它并不需要花費(fèi)額外的空間并且它還允許鏡像內(nèi)的數(shù)據(jù)來做Volume

備份

如果你在用數(shù)據(jù)容器,做備份是相當(dāng)容易的:

  1. $ docker run --rm --volumes-from dbdata -v $(pwd):/backup debian tar cvf /backup/backup.tar /var/lib/postgresql/data 

該示例應(yīng)該會將Volume里所有的東西壓縮為一個(gè)tar包(官方的postgres Dockerfile定義了一個(gè)Volume在/var/lib/postgresql/data目錄下)

權(quán)限與許可

通常你需要設(shè)置Volume的權(quán)限或者為Volume初始化一些默認(rèn)數(shù)據(jù)或者配置文件。要注意的關(guān)鍵點(diǎn)是,在Dockerfile的VOLUME指令后的任何東西將不能改變該volume,比如:

  1. FROM debian:wheezy RUN useradd foo 
  2. VOLUME /data 
  3. RUN touch /data/x 
  4. RUN chown -R foo:foo /data 

該Docker file預(yù)期所料將不會工作,我們希望touch命令在鏡像的文件系統(tǒng)上運(yùn)行,但是實(shí)際上它是在一個(gè)臨時(shí)容器的Volume上運(yùn)行。如下所示:

  1. FROM debian:wheezy RUN useradd foo 
  2. RUN mkdir /data && touch /data/x 
  3. RUN chown -R foo:foo /data 
  4. VOLUME /data 

Docker是足夠聰明的復(fù)制存在掛載于鏡像Volume下的文件到Volume下,并正確地設(shè)置權(quán)限。如果您指定Volume的主機(jī)目錄(使主機(jī)文件不小心被覆蓋)將不會出現(xiàn)這種情況。

如果你能設(shè)置權(quán)限在RUN指令,那么你將不得不在容器創(chuàng)建后使用CMD或ENTRYPOINT腳本來執(zhí)行。

刪除Volumes

該功能比大多數(shù)人意識到的可能更微妙一些。如果你已經(jīng)使用docker rm來刪除你的容器,可能有很多的孤立的Volumes在占用著那些空間。

Volume只有在下列情況下才能被刪除:

  • 該容器可以用docker rm -v來刪除且沒有其他容器連接到該Volume(以及主機(jī)目錄是也沒被指定為Volume)。注意,-v是必不可少的。
  • 該-rm標(biāo)志被提供給docker run的

除非你已經(jīng)很小心的,總是像這樣來運(yùn)行容器,否則你將會在/var/lib/docker/vfs/dir目錄下得到一些僵尸文件和目錄,并且還不容易說出他們到底代表什么。

原文鏈接:http://dockerone.com/article/128

【責(zé)任編輯:Ophira TEL:(010)68476606】

責(zé)任編輯:Ophira 來源: dockerone
相關(guān)推薦

2009-12-09 11:40:02

Linux防火墻

2011-11-09 09:26:55

虛擬化云計(jì)算vSphere 5.0

2011-11-10 09:32:41

虛擬化vSphere 5.0存儲I

2009-10-16 11:15:38

Windows 7

2015-11-13 09:50:17

數(shù)據(jù)中心運(yùn)營

2021-09-08 06:51:52

AndroidRetrofit原理

2019-02-13 14:26:00

2024-11-01 08:57:07

2023-09-19 22:47:39

Java內(nèi)存

2021-10-10 13:31:14

Java負(fù)載均衡算法

2021-09-10 07:31:54

AndroidAppStartup原理

2013-05-03 17:00:26

云架構(gòu)師SOA云計(jì)算

2021-07-12 18:11:41

5GVR醫(yī)療發(fā)展

2014-03-26 09:23:13

2013-01-09 10:52:29

云架構(gòu)師架構(gòu)師云計(jì)算

2023-03-23 10:53:38

5G物聯(lián)網(wǎng)

2021-10-15 09:19:17

AndroidSharedPrefe分析源碼

2022-02-14 07:47:26

overlayfsdockerrootfs

2009-07-09 08:14:54

Chrome操作系統(tǒng)上網(wǎng)本Google
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號