Docker數(shù)據(jù)存儲(chǔ)之Volumes詳解
默認(rèn)容器的數(shù)據(jù)的讀寫發(fā)生在容器的存儲(chǔ)層,當(dāng)容器被刪除時(shí)其上的數(shù)據(jù)將會(huì)丟失。所以我們應(yīng)該盡量保證容器存儲(chǔ)層不發(fā)生寫操作,為了實(shí)現(xiàn)數(shù)據(jù)的持久化存儲(chǔ)我們需要選擇一種方案來(lái)保存數(shù)據(jù),當(dāng)前有以下幾種方式:
- Volumes
- Bind mounts
- tmpfs mounts
下圖展示了這三種技術(shù):

Volumes
Volumes(數(shù)據(jù)卷)是一個(gè)可供一個(gè)或多個(gè)容器使用的位于宿主機(jī)上特殊目錄,它擁有以下特性:
- 數(shù)據(jù)卷可以在容器間共享和重用
- 對(duì)數(shù)據(jù)卷的寫入操作,不會(huì)對(duì)鏡像有任何影響
- 數(shù)據(jù)卷默認(rèn)會(huì)一直存在,即使容器被刪除
使用數(shù)據(jù)卷的目的是持久化容器中的數(shù)據(jù),以在容器間共享或者防止數(shù)據(jù)丟失(寫入容器存儲(chǔ)層的數(shù)據(jù)會(huì)丟失)。
使用數(shù)據(jù)卷的步驟一般分為兩步:
- 創(chuàng)建一個(gè)數(shù)據(jù)卷
- 使用-v或--mount參數(shù)將數(shù)據(jù)卷掛載容器指定目錄中,這樣所有該容器針對(duì)該指定目錄的寫操作都會(huì)保存在宿主機(jī)上的Volume中。
Volume管理
創(chuàng)建一個(gè)Volume:
$ docker volume create my-vol
查看Volumes:
$ docker volume ls local my-vol
$ docker volume inspect my-vol
[
{
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/my-vol/_data",
"Name": "my-vol",
"Options": {},
"Scope": "local"
}
]
我么可以看到創(chuàng)建的Volume my-vol保存在目錄/var/lib/docker/volumes/下,以后所有針對(duì)該Volume的寫數(shù)據(jù)都會(huì)保存中目錄/var/lib/docker/volumes/my-vol/_data下。
刪除一個(gè)Volume:
$ docker volume rm my-vol
或者刪除所有未使用的Volumes:
docker volume prune
掛載數(shù)據(jù)卷到容器目錄
創(chuàng)建了一個(gè)Volume之后,我們可以在運(yùn)行容器時(shí)通過(guò)指定-v或--mount參數(shù)來(lái)使用該Volume:
使用--mount參數(shù):
$ docker run -d \ --name=nginxtest \ --mount source=nginx-vol,destination=/usr/share/nginx/html \ nginx:latest
source指定volume,destination指定容器內(nèi)的文件或文件夾。
或者使用-v參數(shù):
$ docker run -d \ --name=nginxtest \ -v nginx-vol:/usr/share/nginx/html \ nginx:latest
掛載成功后,容器從/usr/share/nginx/html目錄下讀取或?qū)懭霐?shù)據(jù),實(shí)際上都是從宿主機(jī)的nginx-vol數(shù)據(jù)卷中讀取或?qū)懭霐?shù)據(jù)。因此Volumes或Bind mounts也可以看作是容器和宿主機(jī)共享文件的一種方式。
-v參數(shù)使用冒號(hào)分割source和destination,冒號(hào)前半部分是source,后半部分是destination。
如果你掛載一個(gè)還不存在的數(shù)據(jù)卷,Docker會(huì)自動(dòng)創(chuàng)建它。(因此創(chuàng)建數(shù)據(jù)卷那一步非必需)
如果容器中的待掛載的目錄不是一個(gè)空目錄,那么該目錄下的文件會(huì)被復(fù)制到數(shù)據(jù)卷中。(Bind mounts下,宿主機(jī)上的目錄總會(huì)覆蓋容器中的待掛載目錄)
-v參數(shù)和--mount參數(shù)總的來(lái)說(shuō)功能幾乎相同,唯一的區(qū)別是在運(yùn)行一個(gè)service時(shí)只能夠--mount參數(shù)來(lái)掛載數(shù)據(jù)卷。
使用只讀數(shù)據(jù)卷
有些情況下,我們希望某個(gè)數(shù)據(jù)卷對(duì)某個(gè)容器來(lái)說(shuō)是只讀的,可以通過(guò)添加readonly選項(xiàng)來(lái)實(shí)現(xiàn):
$ docker run -d \ --name=nginxtest \ --mount source=nginx-vol,destination=/usr/share/nginx/html,readonly \ nginx:latest
或者使用-v參數(shù):
$ docker run -d \ --name=nginxtest \ -v nginx-vol:/usr/share/nginx/html:ro \ nginx:latest
Volumes使用場(chǎng)景
請(qǐng)參考這篇文章:Docker數(shù)據(jù)存儲(chǔ)總結(jié)
參考文章
https://docs.docker.com/storage/volumes/#share-data-among-machines
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接
相關(guān)文章
SpringBoot打包成Docker鏡像的項(xiàng)目實(shí)踐
Spring Boot和Docker,可以方便地將應(yīng)用程序部署到不同的環(huán)境中,本文主要介紹了SpringBoot打包成Docker鏡像的項(xiàng)目實(shí)踐,具有一定的參考價(jià)值,感興趣的可以了解一下2024-03-03
對(duì)已有的docker容器增加新的端口映射問(wèn)題(兩種方式)
這篇文章主要介紹了對(duì)已有的docker容器增加新的端口映射,在運(yùn)行容器時(shí)指定映射端口運(yùn)行后,如果想要添加新的端口映射,使用兩種方式都可以,需要的朋友可以參考下2022-01-01
Docker 數(shù)據(jù)卷權(quán)限實(shí)例詳解
這篇文章主要介紹了Docker 數(shù)據(jù)卷權(quán)限實(shí)例詳解的相關(guān)資料,在運(yùn)行Docker 容器的時(shí)候需要添加權(quán)限,這里就給大家舉例說(shuō)明如何實(shí)現(xiàn),需要的朋友可以參考下2016-11-11
簡(jiǎn)述Docker安裝Tomcat鏡像并部署web項(xiàng)目
這篇文章主要介紹了簡(jiǎn)述Docker安裝Tomcat鏡像并部署web項(xiàng)目,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10
windows server 2016安裝docker的方法步驟
這篇文章主要介紹了windows server 2016安裝docker的方法步驟,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-06-06
docker compose部署cassandra集群的操作代碼
這篇文章主要介紹了docker compose部署cassandra集群的操作代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2024-03-03

