Docker學習之路(三) docker 文件 分層理解 數據卷 數據同步
(一) 個人分層理解
在前文中 有過 拉取Mysql 最新版後 再拉取mysql 5.7.30在下載鏡像的時候 提示有些文件已存在!
其實 通過第二章 學習 拉取了許許多多鏡像後 終於發現 無論什麼鏡像 在下載的時候 都不是一個下載進度條 都是多層 多個進度條下載 有的會提示 Already exists 好像 一個鏡像被拆分成了 多層寶塔一般 同時分層下載。
個人理解 : 這種分層技術 是 docker 強大的功能點之一 會減少很多的冗餘文件 每一個鏡像 都設置爲寶塔形,進行分層 。當某一個鏡像 依賴於另一個鏡像的分層 時會先判斷 該層是否已存在 如果存在 則不下載 ,僅僅下載鏡像所需的額外部分。 類似於蓋樓房 一層一層的堆積 上層依賴於下層。 那麼當刪除鏡像的時候呢 ,也會查看自己構成鏡像的所有層 如果 自己的某層級在被另一個鏡像所依賴(使用)則會忽略刪除該層。
正如咱上放的mysql 可能依賴於什麼 (舉個例子: centos 啊 xxxx等) 那麼在第一次pull mysql 時 會判斷當前docker 是否含有 這個centos 鏡像分層 有的話 則不下載 ,繼續下載mysql 鏡像所必須要使用的其餘分層。 然後一層一層的 下載完後 組成了一個完整的 mysql鏡像。
當我們再次下載 mysql5.7.30的時候 可能 mysql:5.7.30 鏡像與mysql 鏡像 有使用到相同的層級 那麼在pull mysql:5.7.30的時候 會先查詢docker 是否含有mysql:5.7.30所要使用的 鏡像 ,經查詢 發現果然 有的層已經是被在拉取 mysql的時候下載了 ,所以拉取5.7.30的時候回提示 Already exists,由於構建mysql5.7.30其餘層沒有 則繼續下載新的其餘的層級。
(二)數據卷的簡單使用
數據卷概念
docker 容器雖然好用 ,但是咱發現了一些問題
場景1: 比如,我在安裝了mysql 並把mysql 作爲數據源 在項目中使用 ,那麼不想使用這個容器 或者這個容器出現問題 需要刪除時 不是吧mysql 容器中的數據也刪除了嗎?? 這不就是我們產後說的,刪庫跑路嗎。 需求:需要 容器數據持久化 或綁定到外部宿主機
場景2: 通過前文 發現了 容器中 無法使用一個Linux命令 ,例如 ll,vim,vi等 那麼我們在修改一些配置文件時就很不方便 例如 修改redis ,mongo 等配置文件 ,還需要額外下載vim 等命令 ,每個容器都需要下載,且下載速非常緩慢,這樣,肯定是不行的。 需求:外部修改 同步到容器 或類似於宿主機與容器間的端口映射
將宿主機中的某個目錄,映射到容器中,這樣,在容器中此目錄下的修改,即便容器關閉,數據也會保留下來,供宿主機和其他容器訪問。
數據卷是一個可供容器使用的特殊目錄,它繞過文件系統,可以提供很多有用的特性:
- 數據卷可以在容器之間共享和重用
- 對數據卷的修改會立馬生效
- 對數據卷的更新,不會影響鏡像
- 卷會一直存在,直到沒有容器使用
數據卷的使用
在run 鏡像的時候 使用-v 參數 來實現 宿主目錄與虛擬機目錄進行掛載映射
例如 啓動一個redis 鏡像 設置端口映射 設置別名爲aa
docker run -d -p 6888:6379 --name aaa -v /test:/data redis
發現咱們的宿主機 /test 目錄已經與 aaa 容器 /data 目錄掛載起來了
使用xshell再打開一個窗口 進行同步測試
咱們在 容器中新建一個 qqqq.file 文件 ,查看 宿主機中 /test 目錄下是否會自動添加
我們再在容器中 輸出語句到 qqqq.file中
在容器輸出語句到 qqqq.file 也同步到了 外部的 /test目錄下的 qqqq.file 文件
那麼容器內部 同步到外部 沒什麼問題了 咱再測測 外部文件同步內部容器
發現外部添加的 leilei.java 文件也同步到了容器內
那麼 咱們 關閉容器 是否還能進行同步呢?
首先ctrl+p+q退出容器後 在宿主機上編寫 語句 然後從起容器進入內部查看-----發現也同步了
特別需要注意的是:刪除文件 也是同步的,無論是刪除宿主機上文件 還是容器內部文件都會進行同步刪除
咱將整合容器進行刪除 ----整個容器刪除 數據不會同步 意思是 不會因爲容器的刪除 而刪除其掛載在外部宿主機的目錄
那麼做一個小的總結
容器內新建 刪除 修改文件 <---------------> 宿主機外部掛載的目錄 同步
容器刪除<-----|||||-----> 宿主機外部掛載的目錄不會同步
…未完待續