1. 簡(jiǎn)介
volume 是將 host 目錄樹中的某個(gè)目錄/文件掛載到 docker container 目錄樹中,可以用來(lái)存儲(chǔ)和共享持久化數(shù)據(jù),獨(dú)立于具體的 container。
images 用來(lái)打包和發(fā)布靜態(tài)文件,volume 用來(lái)持有動(dòng)態(tài)數(shù)據(jù)。
volume 分為兩種:bind mount volumes & Docker-managed volumes
2. Bind mount volumes
bind mount volumes 指向 host 文件系統(tǒng)的某個(gè)指定位置。
用法非常簡(jiǎn)單:
docker run -d --name test_volume -v ~/example-docs:/usr/local/htdocs -p 80:80
httpd:latest
2.1 使用場(chǎng)景:
- container 需要用到 host 文件系統(tǒng)中的文件或目錄
- container 需要和 host 中的非容器內(nèi)程序共享 host 中的數(shù)據(jù)時(shí)
即可將 host 中的 ~/example-docs 目錄掛載到 container 的 /usr/local/htdocs 下
其中, -v 的 key 是 host 的路徑,value 是 container 的路徑。
需要注意:
- -v 的 key 需要是絕對(duì)路徑
- 如果 container 中的 -v value 中已經(jīng)存在數(shù)據(jù),則會(huì)被掛載的 host 中的目錄覆蓋
- 如果指定的 host 中的文件目錄不存在,docker 會(huì)自動(dòng)幫我們創(chuàng)建
有時(shí),為了安全,我們需要限制 container 對(duì)掛載點(diǎn)只讀,同樣很簡(jiǎn)單,只需加:ro即可:
docker run --name bmweb_ro --volume ~/example-docs:/usr/local/apache2/htdocs/:ro -p 80:80 httpd:latest
2.2 缺點(diǎn)
- bind mount volume 會(huì)導(dǎo)致 container 強(qiáng)依賴固定的主機(jī)
- 不同的 container 操作同一個(gè) host 文件可能導(dǎo)致沖突
如果需要主機(jī)無(wú)關(guān)的 volume ,可以使用 Docker-managed volumes.
3. Docker-managed volumes
Docker-managed volumes 與 Bind mount volumes 雖然數(shù)據(jù)都是持有在 host 中,但最大的不同之處在于:前者是由 docker daemon 來(lái)管理的。
創(chuàng)建方式:
docker run -d -v /var/lib/cassandra/data --name cass-shared alpine echo Data Container
和 bind mount volume 的不同在于,-v 只有 key,沒(méi)有 value。key 是 container 中的路徑。可以通過(guò)docker inspect來(lái)查看 volume 信息。
4. sharing volumes
兩種類型的 volume 對(duì)應(yīng)兩種不同的共享方式。
4.1 Host-dependent sharing
Host-dependent sharing 顧名思義,依賴主機(jī)的共享,需要使用 bind mount volume。在已知 host 文件系統(tǒng)路徑的情況下,將多個(gè) container 同時(shí)綁定到 bind mount volume 上。
缺點(diǎn):當(dāng)有大量機(jī)器集群的時(shí)候,Host-dependent sharing 是非常難以維護(hù)和管理的。
4.2 Generalized sharing
通過(guò) --volumes-from 將 docker-managed volumes 掛載到其他 containers 中
。volumes 可以被直接 cp 或傳遞性的 cp。