文/Anoyi
? 前言介紹
為了獲得最佳的性能和可移植性亿乳,應該避免將重要數(shù)據(jù)直接寫入容器的可寫層硝拧,而應使用數(shù)據(jù)卷或綁定掛載。這個原則也適用于服務葛假。
可以為集群中的服務創(chuàng)建兩種類型的掛載障陶,數(shù)據(jù)卷掛載(volume mounts)或綁定掛載(bind mounts)。無論使用哪種類型的掛載聊训,在創(chuàng)建服務時使用 --mount
標志進行配置抱究,或者在更新服務時使用 --mount-add
或 --mount-rm
標志。如果不指定一個類型带斑,默認類型是數(shù)據(jù)卷掛載鼓寺。
tmpfs mount 僅可用于獨立容器勋拟,不能在 Docker Swarm Service 中使用,故此處不介紹妈候。
? 數(shù)據(jù)卷掛載 (DATA VOLUMES) ??
數(shù)據(jù)卷是在主機上的持久化存儲敢靡,即使容器刪除,也不會影響數(shù)據(jù)卷苦银。數(shù)據(jù)卷的相關(guān)操作見文末《附錄 1 Docker 數(shù)據(jù)卷常用操作》
掛載已存在的數(shù)據(jù)卷
docker service create \
--mount src=<VOLUME-NAME>,dst=<CONTAINER-PATH> \
--name myservice \
<IMAGE>
在即將啟動容器之前自動創(chuàng)建數(shù)據(jù)卷
docker service create \
--mount type=volume,src=<VOLUME-NAME>,dst=<CONTAINER-PATH>,volume-driver=<DRIVER>,volume-opt=<KEY0>=<VALUE0>,volume-opt=<KEY1>=<VALUE1>
--name myservice \
<IMAGE>
注意:如果
volume-opt
參數(shù)中包含逗號啸胧, 則需要用雙引號修飾此參數(shù),并用單引號修飾整個--mount
配置幔虏,示例:docker service create \ --mount type=volume,src=<VOLUME-NAME>,dst=<CONTAINER-PATH>,volume-driver=<DRIVER>,volume-opt=<KEY0>=<VALUE0>,volume-opt=<KEY1>=<VALUE1> --name myservice \ <IMAGE>
? 綁定掛載 (BIND MOUNTS) ??
綁定掛載是調(diào)度程序為該任務部署容器時主機的文件系統(tǒng)路徑吓揪,Docker 將路徑掛載到容器中。在 Swarm 為任務初始化容器之前所计,該文件系統(tǒng)路徑必須存在柠辞。
允許文件讀寫
docker service create \
--mount type=bind,src=<HOST-PATH>,dst=<CONTAINER-PATH> \
--name myservice \
<IMAGE>
文件只讀
docker service create \
--mount type=bind,src=<HOST-PATH>,dst=<CONTAINER-PATH>,readonly \
--name myservice \
<IMAGE>
重要:雖然綁定掛載能用,但是也有可能導致一些問題:
- 如果你掛載了一個主機路徑到你的服務容器中主胧,那么這個路徑必須存在于 Swarm 集群中的每一個節(jié)點叭首。Docker Swarm 調(diào)度器會把容器調(diào)度到任何滿足資源可用性和滿足你特定約束、位置偏好的節(jié)點上踪栋。
- 如果運行中的容器變得不健康或者不可用焙格,那么 Docker Swarm 調(diào)度器可能會隨時重新安排它。
- 主機綁定掛載是完全不可移植的夷都。當你使用綁定掛載時眷唉,不能保證你的應用在開發(fā)中的運行方式與在生產(chǎn)中的運行方式相同。
? 附錄 1 Docker 數(shù)據(jù)卷常用操作
創(chuàng)建數(shù)據(jù)卷
docker volume create <VOLUME_NAME>
docker@ManagerX:~$ docker volume create data_mongo
data_mongo
數(shù)據(jù)卷列表
docker volume ls
docker@ManagerX:~$ docker volume ls
DRIVER VOLUME NAME
local data_mongo
數(shù)據(jù)卷詳情
docker volume inspect <VOLUME_NAME>
docker@ManagerX:~$ docker volume inspect data_mongo
[
{
"CreatedAt": "2018-01-11T10:50:30Z",
"Driver": "local",
"Labels": {},
"Mountpoint": "/mnt/sda1/var/lib/docker/volumes/data_mongo/_data",
"Name": "data_mongo",
"Options": {},
"Scope": "local"
}
]
刪除數(shù)據(jù)卷
docker volume rm <VOLUME_NAME>
docker@ManagerX:~$ docker volume rm data_mongo
data_mongo
批量刪除無用數(shù)據(jù)卷
docker volume prune
官方文檔https://docs.docker.com/engine/reference/commandline/volume_create/