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