dockerfile中的上下文怎麼理解?FROM centos:latest
VOLUME /share/data #聲明容器中/share/data為匿名卷
,今天小編就來聊一聊關于dockerfile中的上下文怎麼理解?接下來我們就一起去研究一下吧!
FROM centos:latest
VOLUME /share/data #聲明容器中/share/data為匿名卷
這個指令很容易和啟動時的-v指令搞混淆,他們之間到底有什麼區别呢,什麼時候需要使用volume呢?volume指令指定的位置在容器被删除以後數據文件會被删除嗎?如果-v和volume指定了同一個位置,會發生什麼事呢?
volume和run -v的區别,什麼時候需要使用volume
容器運行時應該盡量保持容器存儲層不發生寫操作,對于數據庫類需要保存動态數據的應用,其數據庫文件應該保存于卷(volume)中。為了防止運行時用戶忘記将動态文件所保存目錄挂載為卷,在Dockerfile 中,我們可以事先指定某些目錄挂載為匿名卷,這樣在運行時如果用戶不指定挂載,其應用也可以正常運行,不會向容器存儲層寫入大量數據。
那麼Dockerfile中的VOLUME指令實際使用中是不是就是跟docker run中的-v參數一樣是将宿主機的一個目錄綁定到容器中的目錄以達到共享目錄的作用呢?
并不然,其實VOLUME指令隻是起到了聲明了容器中的目錄作為匿名卷,但是并沒有将匿名卷綁定到宿主機指定目錄的功能。
當我們生成鏡像的Dockerfile中以Volume聲明了匿名卷,并且我們以這個鏡像run了一個容器的時候,docker會在安裝目錄下的指定目錄下面生成一個目錄來綁定容器的匿名卷(這個指定目錄不同版本的docker會有所不同),我當前的目錄為:/var/lib/docker/volumes/{容器ID}。
總結: volume隻是指定了一個目錄,用以在用戶忘記啟動時指定-v參數也可以保證容器的正常運行。比如mysql,你不能說用戶啟動時沒有指定-v,然後删了容器,就把mysql的數據文件都删了,那樣生産上是會出大事故的,所以mysql的dockerfile裡面就需要配置volume,這樣即使用戶沒有指定-v,容器被删後也不會導緻數據文件都不在了。還是可以恢複的。
volume指定的位置在容器被删除以後數據文件會被删除嗎volume與-v指令一樣,容器被删除以後映射在主機上的文件不會被删除。
如果-v和volume指定了不同的位置,會發生什麼事呢?會以-v設定的目錄為準,其實volume指令的設定的目的就是為了避免用戶忘記指定-v的時候導緻的數據丢失,那麼如果用戶指定了-v,自然而然就不需要volume指定的位置了。
總結其實一般的dockfile如果不是數據庫類的這種需要持久化數據到磁盤上的應用,都是無需指定volume的。指定volume隻是為了避免用戶忘記指定-v時導緻的數據全部在容器中,這樣的話容器一旦被删除所有的數據都丢失了。
那麼為什麼dockerfile中不提供一個能夠映射為主機目錄:容器目錄這樣的指令呢?其實這樣的設計是有道理的,如果在dockerfile中指定了主機目錄,這樣dockerfile就不具備了可移植性了,畢竟每個人所需要映射的目錄可能是不同的,那麼最好的辦法就是把這個權利交給每個運行這個dockerfile的人,所以才會有 run -v 主機目錄:容器目錄 這樣的指令。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!