數(shù)據(jù)卷(Data Volumes)
之前我們了解到 Container 僅包含鏡像文件部分,對于進程運行的數(shù)據(jù)或可變的數(shù)據(jù)我們存在數(shù)據(jù)卷中赏廓,Docker 提供了兩種形式數(shù)據(jù)管理:
- 數(shù)據(jù)卷 (Data Volumes)
- 數(shù)據(jù)卷容器 (Data Volumes Containers)
數(shù)據(jù)卷是一個可供一個或多個容器使用的特殊目錄,它繞過 UFS刨摩,可以提供很多有用的特性:
- 數(shù)據(jù)卷可以在容器之間共享和重用
- 對數(shù)據(jù)卷的修改會立馬生效
- 對數(shù)據(jù)卷的更新弥锄,不會影響鏡像
- 數(shù)據(jù)卷默認會一直存在账月,即使容器被刪除
簡單的來說,卷就是將宿主機中的某個目錄 mount 到容器中赁项,這樣在容器中修改了此目錄下的內容即使容器關閉后數(shù)據(jù)也會保留下來葛躏。數(shù)據(jù)卷主要是為容器提供了一種數(shù)據(jù)持久化和共享文件夾。
創(chuàng)建數(shù)據(jù)卷
在用 docker run
命令的時候悠菜,可以使用 -v 標記來創(chuàng)建一個數(shù)據(jù)卷并掛載到容器在中舰攒。
我們也可以通過多次使用 -v
命令來指定多個掛載的文件到容器中,也可以讓多個容器指定相同的宿主機目錄達到共享目的悔醋。
Docker 掛載數(shù)據(jù)卷的默認權限是讀寫摩窃,用戶也可以通過 :or
指定為只讀。
也可以在 Dockerfile 中使用 VOLUMES 來添加一個或多個新的卷到由該鏡像創(chuàng)建的任意容器。
docker run -d -P --name web -v /webapp training/webapp python app.py
掛載后我們可以通過 docker inspect
來查看容器的掛載數(shù)據(jù)卷的配置信息猾愿。
"Mounts": [
{
"Type": "volume",
"Name": "151d0b6ff7c37952155f932ddd524b14a5d63f86a9e7f870735984a07a6d5473",
"Source": "/var/lib/docker/volumes/151d0b6ff7c37952155f932ddd524b14a5d63f86a9e7f870735984a07a6d5473/_data",
"Destination": "/webapp",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
]
刪除數(shù)據(jù)卷
數(shù)據(jù)卷是被設計用來持久化數(shù)據(jù)的鹦聪,它的生命周期獨立于容器,Docker 不會在容器被刪除后自動刪除數(shù)據(jù)卷蒂秘,并且也不存在垃圾回收這樣的機制來處理沒有任何容器引用的數(shù)據(jù)卷泽本。如果需要在刪除容器的同時移除數(shù)據(jù)卷∫錾可以在刪除容器的時候使用 docker rm -v
這個命令规丽。
掛載一個主機目錄作為數(shù)據(jù)卷
docker run -d -P --name web -v /src/webapp:/opt/webapp training/webapp python app.py
上面的意思是把宿主機的 /src/webapp
目錄掛載到容器的 /opt/webapp
。這個功能在進行測試的時候十分方便段化,比如用戶可以放置一些程序到本地目錄中嘁捷,來查看容器是否正常工作。本地目錄的路徑必須是絕對路徑显熏,如果目錄不存在 Docker 會自動創(chuàng)建它雄嚣。
掛載一個本地主機文件作為數(shù)據(jù)卷
docker run --rm -it -v ~/.bash_history:/.bash_history ubuntu /bin/bash
我們也可以指定單個文件掛載到容器中,這樣可以對該文件進行操作喘蟆。
數(shù)據(jù)卷容器
如果你有一些持續(xù)更新的數(shù)據(jù)需要在容器之間共享缓升,最好創(chuàng)建數(shù)據(jù)卷容器。
數(shù)據(jù)卷容器其實就是一個正常的容器蕴轨,專門用來提供數(shù)據(jù)卷供其他容器掛載的港谊。
docker run -d -v /dbdata --name dbdata training/postgres echo Data-only container for postgres
然后在其他容器中使用 --volumes-from
來掛載 dbdata 容器中的數(shù)據(jù)卷。也可以指定多個 --volumes-from
來掛載不同的數(shù)據(jù)卷橙弱。
docker run -d --volumes-from dbdata --name db1 training/postgres
docker run -d --volumes-from dbdata --name db2 training/postgres