前言
為了獲得最佳的性能和可移植性,應該避免將重要數據直接寫入容器的可寫層,而應使用數據卷或綁定掛載。
可以為集群中的服務創建兩種類型的掛載,數據卷掛載(volume mounts)或綁定掛載(bind mounts)。
無論使用哪種類型的掛載,在創建服務時使用 --mount 標志進行配置,或者在更新服務時使用 --mount-add 或 --mount-rm 標志。如果不指定一個類型,默認類型是數據卷掛載。
注:tmpfs mount 僅可用於獨立容器,不能在 Docker Swarm Service 中使用,故此處不介紹。
一、數據卷掛載
數據卷是在主機上的持久化存儲,即使容器刪除,也不會影響數據卷。
使用 docker volume create 命令創建一個volume:
docker volume create --name cwxvolume
使用 docker volume ls 命令查看volume列表:
docker volume ls
創建服務時使用創建好的volume掛載目錄:
docker service create --name masl -e TZ="Asia/Shanghai" --network mrp_net --mount type=volume,src=cwxvolume,dst=/home/mppay/logs/masl --replicas 2 -p 8081:8080 172.16.99.2:40305/masl:dev-yc-34
參數src寫成
source
也可以;dst表示容器內的路徑,也可以寫成destination
使用 docker service ps 命令查看服務情況:
docker service ps masl
發現分別在 manager-node 和 node1 節點上都創建了 masl 任務。
登陸 manager-node 服務器,使用 docker ps -a 命令查看容器運行情況:
docker ps -a
再使用 docker exec 進入容器:
docker exec -ti f820be6cf958 /bin/bash
發現,在容器內部的 /home/mppay/logs/masl 目錄下有一個 masl.log文件,然后輸入exit命令退出容器。
使用 docker volume inspect 命令查看掛載詳細信息
docker volume inspect cwxvolume
進入上面指定的目錄:
cd /var/lib/docker/volumes/cwxvolume/_data
ls
發現宿主機上也有這個文件。
二、綁定掛載
綁定掛載是調度程序為該任務部署容器時主機的文件系統路徑,Docker 將路徑掛載到容器中。在 Swarm 為任務初始化容器之前,該文件系統路徑必須存在。
使用以下命令創建服務:
docker service create --name masl -e TZ="Asia/Shanghai" --network mrp_net --mount type=bind,source=/usr/local/tomcal_masl/logs,destination=/home/mppay/logs/masl --replicas 2 -p 8081:8080 172.16.99.2:40305/masl:dev-yc-34
其中,參數destination表示容器里面的路徑,
source
表示本地硬盤路徑
重要:雖然綁定掛載能用,但是也有可能導致一些問題:
1) 如果你掛載了一個主機路徑到你的服務容器中,那么這個路徑必須存在於 Swarm 集群中的每一個節點。Docker Swarm 調度器會把容器調度到任何滿足資源可用性和滿足你特定約束、位置偏好的節點上。
2) 如果運行中的容器變得不健康或者不可用,那么 Docker Swarm 調度器可能會隨時重新安排它。
3) 主機綁定掛載是完全不可移植的。當你使用綁定掛載時,不能保證你的應用在開發中的運行方式與在生產中的運行方式相同。
總結
1) 掛載volume后,宿主機和容器之間就可以通過volume進行雙向實時同步.
2) 如果replicas是多份,則每個節點宿主機上都會有一個volume路徑,即每個節點宿主機的
/var/lib/docker/volumes/cwxvolume/_data
和分布到它上面的
容器里的/home/mppay/logs/masl
進行實時同步.