docker 和挂载文件一起打包成新镜像_Docker文件系统和数据卷
分層結(jié)構(gòu)
當(dāng)容器啟動時,一個新的可寫層被加載到鏡像的頂部。
這一層通常被稱作“容器層”,“容器層”之下的都叫
“鏡像層”。所有對容器的改動 - 無論添加、刪除、還
是修改文件都只會發(fā)生在容器層中。只有容器層是可寫
的,容器層下面的所有鏡像層都是只讀的.鏡像層數(shù)量可能會很多,所有鏡像層會聯(lián)合在一起組成一個統(tǒng)一的文件系統(tǒng)。
OverlayFS
OverlayFS是一個現(xiàn)代聯(lián)合文件系統(tǒng),實現(xiàn)更快,更簡單。
Docker為OverlayFS提供了存儲驅(qū)動程序 --overlay和overlay2
通過docker info 命令可以看到當(dāng)前系統(tǒng)使用的存儲驅(qū)動為
容器的讀寫
對于讀,考慮下列3種場景:
讀的文件不在容器層:如果讀的文件不在容器層,則從鏡像層進(jìn)行讀
讀的文件只存在在容器層:直接從容器層讀
讀的文件在容器層和鏡像層:讀容器層中的文件,因為容器層隱藏了鏡像層同名的文件(上層覆蓋底層)
對于寫,考慮下列場景:
寫的文件不在容器層,在鏡像層:由于文件不在容器層,因此overlay/overlay2存儲驅(qū)動使用copy_up操作從鏡像層拷
貝文件到容器層,然后將寫入的內(nèi)容寫入到文件新的拷貝中。
刪除文件和目錄:刪除鏡像層的文件,會在容器層創(chuàng)建一個whiteout文件來隱藏它;刪除鏡像層的目錄,會創(chuàng)建
opaque目錄,它和whiteout文件有相同的效果
通過對容器的讀寫操作,來舉例說明
將修改后的容器提交為鏡像
將現(xiàn)有容器生成新的鏡像,
docker命令為:docker commit -m ”提交信息” 容器ID 鏡像名稱:tag名稱。
生成的鏡像如上圖
通過docker inspect 命令查看新鏡像信息,在之前的鏡像上增加了一層鏡像
修改dockerfile文件查看鏡像
1、只修改了最后一步,所以鏡像依賴基本不變,只是頂層鏡像文件改變 echo “mmm” > mm.txt
2、而當(dāng)中間插入一步時(mkdir /data2),只有最底層的鏡像文件沒變,后面的都變掉了,因為后面的依賴的文件改變了,其實相同的命令產(chǎn)生的鏡像,diff中的文件還是相同的
數(shù)據(jù)卷-VOLUME
Docker中的數(shù)據(jù)可以存儲在類似于虛擬機(jī)磁盤的介質(zhì)中,稱為數(shù)據(jù)卷(Data Volume)。
數(shù)據(jù)卷可以用來存儲Docker應(yīng)用的數(shù)據(jù),也可以用來在Docker容器間進(jìn)行數(shù)據(jù)共享。數(shù)據(jù)卷呈現(xiàn)給Docker容器的形式就是一個目錄,支持多個容器間共享,修改也不會影響鏡像。使用Docker的數(shù)據(jù)卷,類似在系統(tǒng)中使用 mount 掛載一個文件系統(tǒng)
創(chuàng)建數(shù)據(jù)卷,三種方式:
1、在dockerfile中通過VOLUME指令來增加一個或者多個數(shù)據(jù)卷
2、docker run命令后面跟上-v參數(shù)即可創(chuàng)建一個數(shù)據(jù)卷,當(dāng)然也可以跟多個-v參數(shù)來創(chuàng) 建多個數(shù)據(jù)卷
3、docker volume create volume_name 命令先創(chuàng)建一個數(shù)據(jù)卷
1、通過dockerfile創(chuàng)建數(shù)據(jù)卷 VOLUME[“/data1”,”/data2”]
生成的數(shù)據(jù)卷保存在 /var/lib/docker/volumes目錄下
鏡像生成不會是數(shù)據(jù)卷生成
只有容器啟動時才會生成數(shù)據(jù)卷(docker run –it –name=“volume1” 鏡像ID)
2、docker run –it –v /data3 –name=“volume2” 鏡像ID
相對于1來說,會生成新的數(shù)據(jù)卷
以上兩種方式的數(shù)據(jù)卷名稱是系統(tǒng)默認(rèn)名稱
3、創(chuàng)建好數(shù)據(jù)卷之后
可以指定數(shù)據(jù)卷名稱掛載容器目錄 – docker run –it –v volume_name:/data4 –name=“volume4” 鏡像ID
當(dāng)創(chuàng)建好帶有數(shù)據(jù)卷的容器后,就可以在其他容器中通過--volumes-froms參數(shù)來掛載該數(shù)據(jù)卷了,不管該容器是否運(yùn)行。
停止上面新創(chuàng)的容器(docker ps –a|grep 容器名稱 來查看容器狀態(tài))
掛載前一容器的數(shù)據(jù)卷 – docker run –it –volumes-from 容器ID --name=“volume3” 鏡像ID
與前一容器的數(shù)據(jù)卷路徑相同 – docker inspect 查看
容器間實現(xiàn)了數(shù)據(jù)共享 -- 修改volume3中的數(shù)據(jù),volume2中出現(xiàn)了同樣的數(shù)據(jù)
即使刪除了剛開始的第一個數(shù)據(jù)卷容器,只要有其他容器使用數(shù)據(jù)卷,數(shù)據(jù)卷都不會被刪除的
刪除創(chuàng)建數(shù)據(jù)卷的容器 -- volume2
volume3中數(shù)據(jù)卷并沒有被刪除,因為還有容器掛載在該數(shù)據(jù)卷中
刪除volume3容器,/var/lib/docker/volumes中的數(shù)據(jù)卷也不會刪除,只是沒有辦法被容器所引用,因為掛載它的容器都被刪除了。
查看所有數(shù)據(jù)卷 docker volume ls
刪除需要用docker volume rm 卷名,如果還有容器掛載了該數(shù)據(jù)卷,那么刪除會報錯
也可以把一個本地主機(jī)的目錄當(dāng)做數(shù)據(jù)卷掛載在容器上,同樣是在docker run后面跟-v參數(shù),不過-v后面跟的不再是單獨(dú)的目錄了,它是[host-dir]:[container-dir]:[rw|ro]這樣格式的,host-dir是一個絕對路徑的地址。
運(yùn)行一個容器,以讀寫方式掛載宿主機(jī)上的/data1/www/fjh目錄–-
docker run –it --name=“volume5”–v /data1/www/fjh:/data/fjh(:rw 默認(rèn)) 鏡像ID
查看啟動的容器中獲得了宿主機(jī)的目錄,并向其中添加文件
數(shù)據(jù)與宿主機(jī)之間進(jìn)行了共享
查看數(shù)據(jù)卷中并沒有生成新的文件夾,說明不是生成docker的數(shù)據(jù)卷,而是將宿主機(jī)上的目錄當(dāng)成了數(shù)據(jù)卷
當(dāng)刪除容器后,修改保留在了宿主機(jī)上
當(dāng)運(yùn)行一個容器時,掛載了宿主機(jī)上一個不存在的目錄時,容器和宿主機(jī)同時回新增這個目錄,并將容器的內(nèi)容同步進(jìn)宿主機(jī)
如果host-dir存在,但是指向的是一個不存在的目錄,則docker也會創(chuàng)建該目錄,然后使用該目錄做數(shù)據(jù)源。
如果host-dir不存在,則docker會創(chuàng)建一個新的數(shù)據(jù)卷,
如果 host-dir和docker中的目錄都存在,則宿主機(jī)上的目錄會把docker中的目錄給覆蓋
備份數(shù)據(jù)卷的內(nèi)容的方法可以是創(chuàng)建一個新容器,掛載數(shù)據(jù)卷容器,同時掛載一個本地目錄,然后把數(shù)據(jù)卷容器的數(shù)據(jù)卷通過備份命令備份到映射的本地目錄里面。
將容器volume2掛載的數(shù)據(jù)卷的數(shù)據(jù)內(nèi)容同步到宿主機(jī) --
docker run –rm –volumes-from=volume2 –name=“volume8” -v /data/www/fjh3:/fjh3:rw 鏡像ID cp –rf /data1 /fjh3
啟動一個新的容器并且從volume2容器中掛載卷,然后掛載主機(jī)/data1/www/fjh3目錄到容器中的/fjh3目錄,并將數(shù)據(jù)卷中的/data1 目錄中的數(shù)據(jù)拷貝到/fjh3中,那么數(shù)據(jù)卷中的內(nèi)容就同步到宿主機(jī)中去了,并且執(zhí)行完之后把該容器刪除。
Docker Volume數(shù)據(jù)卷的優(yōu)點:
1)繞過“拷貝寫”系統(tǒng),會直接改變宿主機(jī)上的數(shù)據(jù)卷中的內(nèi)容,且有些文件不需要在docker commit打包進(jìn)鏡像文件。
2)數(shù)據(jù)卷可以在容器間共享和重用數(shù)據(jù)
3)數(shù)據(jù)卷可以在宿主和容器間共享數(shù)據(jù)
4)數(shù)據(jù)卷是持續(xù)性的,直到?jīng)]有容器使用它們。
總結(jié)
以上是生活随笔為你收集整理的docker 和挂载文件一起打包成新镜像_Docker文件系统和数据卷的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 有比较好的家用电热水器推荐吗?
- 下一篇: 乌鲁木齐中天翡丽郡府是哪个开发商?