1、docker 存儲mysql
1. storage drivernginx
容器由最上面一個可寫的容器層,以及若 幹只讀的鏡像層組成,容器的數據就存放 在這些層中。這樣的分層結構最大的特性 是 Copy-on-Write:web
1.新數據會直接存放在最上面的容器層。sql
2.修改現有數據會先從鏡像層將數據複製 到容器層,修改後的數據直接保存在容器 層中,鏡像層保持不變。docker
3.若是多個層中有命名相同的文件,用戶 只能看到最上面那層中的文件。apache
分層結構使鏡像和容器的建立、共享以及分發變得很是高效,而這些都要歸功於 Docker storage driver安全
2.storage driver 選型架構
Docker 支持多種 storage driver,有 AUFS、Device Mapper、Btrfs、OverlayFS、VFS 和 ZFS。它們都能實現分層的架構,同時又有各自的特性。對於 Docker 用戶來講,具體 選擇使用哪一個 storage driver 是一個難題,由於:app
1.沒有哪一個 driver 可以適應全部的場景。工具
2.driver 自己在快速發展和迭代。
不過 Docker 官方給出了一個簡單的答案:
優先使用 Linux 發行版默認的 storage driver。
2、Data Volume
Data Volume 本質上是 Docker Host 文件系統中的目錄或文件,可以直接被 mount 到容 器的文件系統中。Data Volume 有如下特色:
1.Data Volume 是目錄或文件,而非沒有格式化的磁盤(塊設備)。
2.容器能夠讀寫 volume 中的數據。
3.volume 數據能夠被永久的保存,即便使用它的容器已經銷燬。
2.1 、tmpfs mount
應用限制:
1)tmpfs掛載是臨時的,而且僅保留在主機內存中。當容器中止時,將tmpfs刪除安裝,而且不會 保留寫在那裏的文件。
2)與卷和綁定裝入不一樣,您沒法tmpfs在容器之間共享裝載。
2)只有在Linux上運行Docker時才能使用此功能
# docker run -d -it --name tmptest --mount type=tmpfs,dst=/app nginx
# docker run -d -it --name tmptest1 --mount type=tmpfs,dst=/app,tmpfsmode=1660 nginx
2.2 Data Volume
2.2.1 Data Volume 應用場景
1.Database 軟件 vs Database 數據
2.Web 應用 vs 應用產生的日誌
3.數據分析軟件 vs input/output 數據
4.Apache Server vs 靜態 HTML 文件
5.引擎服務 vs 依賴的數據詞典
相信你們會作出這樣的選擇:
1.前者放在數據層中。由於這部份內容是無狀態的,應該做爲鏡像的一部分。
2.後者放在 Data Volume 中。這是須要持久化的數據,而且應該與鏡像分開存放。
2.3 bind mount 文件
2.3.1 bind mount 能夠將 host 上文件 mount 到容器
使用 bind mount 單個文件的場景是:只須要向容器添加文件,不但願覆蓋整個目錄。
使用單一文件有一點要注意:host 中的源文件必需要存在,否則會看成一個新目錄 bind mount 給容器。
2.3.3 bind mount 數據持久性測試
即便容器沒有了,bind mount 也還在。這也合理,bind mount 是 host 文件系統中的數 據,只是借給容器用;
2.3.4 bind mount 權限控制
ro 設置了只讀權限,在容器中是沒法對 bind mount 數據進行修改的。只有 host 有權修 改數據,提升了安全性。
2.3.5 bind mount 優缺點
優勢:
應用場景豐富,好比咱們能夠將源代碼目錄 mount 到容器中,在 host 中修改代碼就能看 到應用的實時效果。再好比將 mysql 容器的數據放在 bind mount 裏,這樣 host 能夠方 便地備份和遷移數據。 bind mount 的使用直觀高效,易於理解;
不足:
bind mount 須要指定 host 文件系統的特定路徑,這就限制了容器的可移植性,當須要將 容器遷移到其餘 host,而該 host 沒有要 mount 的數據或者數據不在相同的路徑時,操 做會失敗。
2.4 docker managed volume
不指定 mount 源,指明 mount point 是否可行?數據又是存在哪裏?
2.4.1) docker managed volume 分析
volume 的內容跟容器原有 /usr/local/apache2/htdocs 徹底同樣,爲何? 這是由於:若是 mount point 指向的是已有目錄,原有數據會被複制到 volume 中。 docker managed volume 的建立過程: 1.容器啓動時,簡單的告訴 docker 我須要一個 volume 存放數據,幫我 mount 到目錄 /xx。
2.docker 在 /var/lib/docker/volumes 中生成一個隨機目錄做爲 mount 源。
3.若是 /xx 已經存在,則將數據複製到 mount 源, 4.將 volume mount 到 /xx
3、兩種 data volume 比較
相同點:二者都是 host 文件系統中的某個路徑。
4、 數據共享 容器與HOST
bind mount 是很是明確的:直接將要共享的目錄 mount 到容器。
docker managed volume 就要麻煩點。因爲 volume 位於 host 中的目錄,是在容器啓動 時才生成,因此須要將共享數據拷貝到 volume 中,好比:
4.2 數據共享 容器與容器
將 $HOME/htdocs mount 到三個 httpd 容器。
修改 volume 中的主頁文件,再次查看並確認全部容器都使用了新的數據內容?
4.3 共享數據 之 volume container
volume container 是專門爲其餘容器提供 volume 的容器。它提供的卷能夠是 bind mount,也能夠是 docker managed volume。
容器 mount 了兩個 volume:
1.bind mount,存放 web server 的靜態文件。
2.docker managed volume,存放一些實用工具
4.5 volume container 應用
volume container 的特色:
1.與 bind mount 相比,沒必要爲每個容器指定 host path,全部 path 都在 volume container 中定 義好了,容器只需與 volume container 關聯,實現了容器與 host 的解耦。
2.使用 volume container 的容器其 mount point 是一致的,有利於配置的規範和標準化,但也帶來 必定的侷限,使用時須要綜合考慮。
5、 Volume 生命週期
備份 由於 volume 其實是 host 文件系統中的目錄和文件,因此 volume 的備份其實是對文件系統的備份。 恢復 volume 的恢復也很簡單,若是數據損壞了,直接用以前備份的數據拷貝到 /myregistry 就能夠了。 遷移 若是咱們想使用更新版本的 Registry,這就涉及到數據遷移,方法是:
1.docker stop 當前 Registry 容器。
2.啓動新版本容器並 mount 原有 volume。
3.docker run -d -p 5000:5000 -v /myregistry:/var/lib/registry registry:latest
固然,在啓用新容器前要確保新版本的默認數據路徑是否發生變化。
銷燬
能夠刪除再也不須要的 volume,但必定要確保知道本身正在作什麼,volume 刪除後數據是找不回來的。docker 不會銷燬 bind mount,刪除數據的工做只能由 host 負責。對於 docker managed volume,在執 行 docker rm 刪除容器時能夠帶上 -v 參數,docker 會將容器使用到的 volume 一併刪除,但前提是沒有 其餘容器 mount 該 volume,目的是保護數據,很是合理。
若是刪除容器時沒有帶 -v 呢
總結:
1.docker 爲容器提供了兩種存儲資源:數據層和 Data Volume。
2.數據層包括鏡像層和容器層,由 storage driver 管理。
3.Data Volume 有兩種類型:bind mount 和 docker managed volume。
4.bind mount 可實現容器與 host 之間,容器與容器之間共享數據。
5.volume container 是一種具備更好移植性的容器間數據共享方案,特別是 data-packed volume container。
6.最後咱們學習瞭如何備份、恢復、遷移和銷燬 Data Volume。