容器学习 之 docker存储(十五)
Docker 為容器提供了兩種存放數(shù)據(jù)的資源:
storage driver
Docker分層結(jié)構(gòu)
storage driver 實(shí)現(xiàn)了多層數(shù)據(jù)的堆疊并為用戶提供一個單一的合并之后的統(tǒng)一視圖。
Docker 支持多種 storage driver,有 AUFS、Device Mapper、Btrfs、OverlayFS、VFS 和 ZFS。它們都能實(shí)現(xiàn)分層的架構(gòu),同時又有各自的特性。Docker
優(yōu)先使用 Linux 發(fā)行版默認(rèn)的 storage driver。
運(yùn)行docker info查看 Ubuntu 的默認(rèn) driver:
Ubuntu 用的 AUFS,底層文件系統(tǒng)是 extfs,各層數(shù)據(jù)存放在 /var/lib/docker/aufs。
對于某些容器,直接將數(shù)據(jù)放在由 storage driver 維護(hù)的層中是很好的選擇,比如那些無狀態(tài)的應(yīng)用。無狀態(tài)意味著容器沒有需要持久化的數(shù)據(jù),隨時可以從鏡像直接創(chuàng)建。但對于另一類應(yīng)用這種方式就不合適了,它們有持久化數(shù)據(jù)的需求,容器啟動時需要加載已有的數(shù)據(jù),容器銷毀時希望保留產(chǎn)生的新數(shù)據(jù),也就是說,這類容器是有狀態(tài)的。
這就要用到 Docker 的另一種存儲機(jī)制:
Data Volume
Data Volume 有以下特點(diǎn):
docker 提供了兩種類型的 volume:bind mount 和 docker managed volume
bind mount
bind mount 是將 host 上已存在的目錄或文件 mount 到容器。
例如 docker host 上有目錄 $HOME/htdocs:
root@ubuntu:~/htdocs# cat index.html this is a file in host file system通過 -v 將其 mount 到 httpd 容器:
root@ubuntu:~/htdocs# docker run -d -p 80:80 -v ~/htdocs:/usr/local/apache2/htdocs httpd 8940a1cf3724e03583c4eac7dca0380c368cf4c75763913f3353b57ae1f23050/usr/local/apache2/htdocs 就是 apache server 存放靜態(tài)文件的地方。由于 /usr/local/apache2/htdocs 已經(jīng)存在,原有數(shù)據(jù)會被隱藏起來,取而代之的是 host $HOME/htdocs/ 中的數(shù)據(jù)。
root@ubuntu:~/htdocs# curl 127.0.0.1:80 this is a file in host file systemcurl 顯示當(dāng)前主頁確實(shí)是 $HOME/htdocs/index.html 中的內(nèi)容。更新一下,看是否能生效:
root@ubuntu:~/htdocs# echo "update index page in mypage" > ~/htdocs/index.html root@ubuntu:~/htdocs# curl 127.0.0.1:80 update index page in mypagehost 中的修改確實(shí)生效了,bind mount 可以讓 host 與容器共享數(shù)據(jù)。這在管理上是非常方便的。
下面我們將容器銷毀,看看對 bind mount 有什么影響:
root@ubuntu:~/htdocs# docker stop 8940a1cf3724 8940a1cf3724 root@ubuntu:~/htdocs# docker rm 8940a1cf3724 8940a1cf3724 root@ubuntu:~/htdocs# cat ~/htdocs/index.html update index page in mypagemount point 有很多應(yīng)用場景,比如我們可以將源代碼目錄 mount 到容器中,在 host 中修改代碼就能看到應(yīng)用的實(shí)時效果。再比如將 mysql 容器的數(shù)據(jù)放在 bind mount 里,這樣 host 可以方便地備份和遷移數(shù)據(jù)。
不過bind mount 需要指定 host 文件系統(tǒng)的特定路徑,這就限制了容器的可移植性,當(dāng)需要將容器遷移到其他 host,而該 host 沒有要 mount 的數(shù)據(jù)或者數(shù)據(jù)不在相同的路徑時,操作會失敗。
docker managed volume
docker run -d -p 80:80 -v /usr/local/apache2/htdocs httpd f4a0a1018968f47960efe760829e3c5738c702533d29911b01df9f18babf3340我們通過 -v 告訴 docker 需要一個 data volume,并將其 mount 到 /usr/local/apache2/htdocs。那么這個 data volume 具體在哪兒呢?
這個答案可以在容器的配置信息中找到,執(zhí)行 docker inspect 命令:
docker inspect 21accc2ca072"Mounts": [{"Name": "f4a0a1018968f47960efe760829e3c5738c702533d29911b01df9f18babf3340","Source": "/var/lib/docker/volumes/f4a0a1018968f47960efe760829e3c5738c702533d29911b01df9f18babf3340/_data","Destination": "/usr/local/apache2/htdocs","Driver": "local","Mode": "","RW": true,"Propagation": ""}]每當(dāng)容器申請 mount docker manged volume 時,docker 都會在/var/lib/docker/volumes 下生成一個目錄(例子中是 "/var/lib/docker/volumes/f4a0a1018968f47960efe760829e3c5738c702533d29911b01df9f18babf3340/_data ),這個目錄就是 mount 源。
root@ubuntu:~/htdocs# cd /var/lib/docker/volumes/49d01a9d7d84ce6462b3c860cee6a971414fadf2fcb27f33c5acf5edc77c4674/_data/ root@ubuntu:/var/lib/docker/volumes/49d01a9d7d84ce6462b3c860cee6a971414fadf2fcb27f33c5acf5edc77c4674/_data# ls index.html root@ubuntu:/var/lib/docker/volumes/49d01a9d7d84ce6462b3c860cee6a971414fadf2fcb27f33c5acf5edc77c4674/_data# cat index.html <html><body><h1>It works!</h1></body></html>修改host的這個掛載的文件試一試:
7f33c5acf5edc77c4674/_data# echo "update valumn form host !" > /var/lib/docker/volumes/49d01a9d7d84ce6462b3c860cee6a971414fadf2fcb27f33c5acf5edc77c4674/_data/index.html root@ubuntu:/var/lib/docker/volumes/49d01a9d7d84ce6462b3c860cee6a971414fadf2fcb27f33c5acf5edc77c4674/_data# curl 127.0.0.1:80 update valumn form host !簡單回顧一下 docker managed volume 的創(chuàng)建過程:
總結(jié)
以上是生活随笔為你收集整理的容器学习 之 docker存储(十五)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 容器学习 之 容器访问外部网络(十四)
- 下一篇: 容器学习 之 共享数据(十六)