默認(rèn)情況下检眯,在容器內(nèi)創(chuàng)建的所有文件都存儲在可寫容器層上。
另一個(gè)進(jìn)程很難從容器中獲取數(shù)據(jù)昆淡,而且當(dāng)容器不再存在時(shí)锰瘸,數(shù)據(jù)不會持久化。
向可寫容器層寫入數(shù)據(jù)時(shí)昂灵,需要一個(gè)存儲驅(qū)動來管理文件系統(tǒng)避凝,比如overlay2,這種方式與直接寫入主機(jī)文件系統(tǒng)的數(shù)據(jù)卷相比眨补,這種額外的抽象降低了性能管削。
docker有兩種方式,可以讓容器在主機(jī)上存儲文件撑螺,且持久化含思。
卷和綁定掛載。如果是在windows上甘晤,還可以使用命名管道含潘。如下圖所示。
其中:
volume是存儲在由docker管理的主機(jī)文件系統(tǒng)的一部分线婚。非docker進(jìn)程不應(yīng)該修改這部分文件系統(tǒng)遏弱。
volume是持久化的最佳方式,下面會解釋酌伊。
bind mount可以存儲在主機(jī)文件系統(tǒng)的任何地方腾窝。其他進(jìn)程可以修改它們。
綁定掛載的性能非常好居砖,但它們依賴于主機(jī)的文件系統(tǒng)具有特定的目錄結(jié)構(gòu)虹脯。如果正在開發(fā)新的Docker應(yīng)用程序,可以考慮使用命名卷奏候。不能使用docker命令來管理綁定掛載循集。
tmpfs掛載只存儲在主機(jī)的內(nèi)存中,并且從不寫到主機(jī)的文件系統(tǒng)中蔗草。其生命周期為容器的生命周期咒彤。
volume的一些用例
1、在多個(gè)運(yùn)行的容器之間共享數(shù)據(jù)
如果您沒有顯式地創(chuàng)建卷咒精,那么卷在第一次掛載到容器中時(shí)就會被創(chuàng)建镶柱。當(dāng)容器停止或被刪除時(shí),該卷仍然存在模叙。多個(gè)容器可以同時(shí)掛載相同的卷歇拆,可以是讀-寫或只讀。卷只有在顯式刪除時(shí)才會刪除。
2故觅、將容器運(yùn)行和主機(jī)解耦
當(dāng)Docker主機(jī)不能保證具有給定的目錄或文件結(jié)構(gòu)時(shí)厂庇。卷可以幫助您將Docker主機(jī)的配置與容器運(yùn)行時(shí)解耦。
3输吏、當(dāng)您希望在遠(yuǎn)程主機(jī)或云提供商(而不是本地)上存儲容器數(shù)據(jù)時(shí)
4权旷、當(dāng)需要將數(shù)據(jù)從一臺Docker主機(jī)備份、恢復(fù)或遷移到另一臺Docker主機(jī)時(shí)贯溅,卷是更好的選擇
可以使用該卷停止容器拄氯,然后備份該卷的目錄(例如/var/lib/docker/volumes/)。
5盗迟、當(dāng)您的應(yīng)用程序需要Docker桌面上的高性能I/O時(shí)
卷存儲在Linux虛擬機(jī)而不是主機(jī)中坤邪,這意味著讀寫具有更低的延遲和更高的吞吐量。
Bind mount的一些用例
1罚缕、從主機(jī)到容器共享配置文件
2艇纺、在Docker主機(jī)和容器上的開發(fā)環(huán)境之間共享源代碼或構(gòu)建工件
例如,您可以將一個(gè)Maven目標(biāo)/目錄掛載到一個(gè)容器中邮弹,每當(dāng)您在Docker主機(jī)上構(gòu)建Maven項(xiàng)目時(shí)黔衡,容器就會訪問重新構(gòu)建的工件。
當(dāng)Docker主機(jī)的文件或目錄結(jié)構(gòu)保證與容器需要的綁定安裝一致時(shí)腌乡。
創(chuàng)建volume掛載例子.
$ docker run -d --name devtest --mount source=myvol2,target=/app nginx:latest
當(dāng)使用docker inspect devtest 查看容器詳細(xì)信息時(shí)盟劫,可以看到如下:
"Mounts": [
{
"Type": "volume",
"Name": "myvol2",
"Source": "/var/lib/docker/volumes/myvol2/_data",
"Destination": "/app",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
注意,容器停止或者刪除時(shí)与纽,volume不會自動刪除侣签,需要手動刪除。
創(chuàng)建bind mount的例子急迂。
$ docker run -d -it --name devtest --mount type=bind,source="$(pwd)"/target,target=/app nginx:latest
當(dāng)使用docker inspect devtest 查看容器詳細(xì)信息時(shí)影所,可以看到如下:
"Mounts": [
{
"Type": "bind",
"Source": "/tmp/source/target",
"Destination": "/app",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],
有兩種方式創(chuàng)建tmpfs掛載。
$ docker run -d -it --name tmptest --mount type=tmpfs,destination=/app nginx:latest```
$ docker run -d -it --name tmptest --tmpfs /app nginx:latest
當(dāng)使用docker inspect tmptest 查看容器詳細(xì)信息時(shí)僚碎,可以看到如下:
"Tmpfs": {
"/app": ""
},