volume和bind volume都是持久化容器數據的方案。
通過持久化容器中的數據,避免了將數據寫入到容器的可寫層,從而呢,可以最大化的容器的性能!更重要的是,提升了容器的可移植性!在service中,同樣的可以使用數據卷和綁定掛載(bind mount)
接下來的部門,說說在service中如何使用數據卷和bind掛載,及其關鍵注意事項!
數據卷
數據卷容器之外的,存儲數據的區域。當容器,task的結束之後,數據卷還是存在的,數據卷需要單獨的進行管理。
數據卷的創建原則
- 可以在部署service之前進行創建
- 可以在調度的時候,會自動的創建
示例
舉個例子,創建service的時候指定volume參數
# 默認沒有任何的數據卷 [root@nccztsjb-node-01 ~]# docker volume ls DRIVER VOLUME NAME [root@nccztsjb-node-01 ~]# # 創建service指定數據卷 docker service create \ --with-registry-auth \ --name=nginx \ --replicas=4 \ --publish published=8080,target=80 \ --mount type=volume,src=nginx-vol,dst=/data \ 172.20.58.152/middleware/nginx:1.21.4
部署過程的詳細信息,如下:
- type是volume,也可以不指定,默認就是volume
- src是數據卷的名字
- dst是容器中掛載的目錄的名字
[root@nccztsjb-node-01 ~]# docker service create \ > --with-registry-auth \ > --name=nginx \ > --replicas=4 \ > --publish published=8080,target=80 \ > --mount type=volume,src=nginx-vol,dst=/data \ > 172.20.58.152/middleware/nginx:1.21.4 iz53dp7yop4q157nev4eu5i19 overall progress: 4 out of 4 tasks 1/4: running [==================================================>] 2/4: running [==================================================>] 3/4: running [==================================================>] 4/4: running [==================================================>] verify: Service converged [root@nccztsjb-node-01 ~]#
查看service的部署情況和volume的信息
service的4個task分佈在集羣的4個節點上,並且每個節點上都自動創建了volume,默認的數據卷的類型是local
[root@nccztsjb-node-01 ~]# docker service ls ID NAME MODE REPLICAS IMAGE PORTS iz53dp7yop4q nginx replicated 4/4 172.20.58.152/middleware/nginx:1.21.4 *:8080->80/tcp [root@nccztsjb-node-01 ~]# docker service ps nginx ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS k05fk94n9d9x nginx.1 172.20.58.152/middleware/nginx:1.21.4 nccztsjb-node-04 Running Running about a minute ago phm5xmwq4ntb nginx.2 172.20.58.152/middleware/nginx:1.21.4 nccztsjb-node-02 Running Running about a minute ago 97x4izunap3r nginx.3 172.20.58.152/middleware/nginx:1.21.4 nccztsjb-node-01 Running Running about a minute ago c809xnt9wwab nginx.4 172.20.58.152/middleware/nginx:1.21.4 nccztsjb-node-05 Running Running about a minute ago [root@nccztsjb-node-01 ~]# [root@nccztsjb-node-01 ~]# # 節點1 [root@nccztsjb-node-01 ~]# docker volume ls DRIVER VOLUME NAME local nginx-vol [root@nccztsjb-node-01 ~]# # 節點2 [root@nccztsjb-node-02 ~]# docker volume ls DRIVER VOLUME NAME local nginx-vol [root@nccztsjb-node-02 ~]# # 節點3 RIVER VOLUME NAME local nginx-vol [root@nccztsjb-node-04 ~]# # 節點4 [root@nccztsjb-node-05 ~]# docker volume ls DRIVER VOLUME NAME local nginx-vol [root@nccztsjb-node-05 ~]#
數據卷在宿主機上的位置
[root@nccztsjb-node-01 ~]# docker volume inspect nginx-vol [ { "CreatedAt": "2022-09-22T10:12:04+08:00", "Driver": "local", "Labels": null, "Mountpoint": "/var/lib/docker/volumes/nginx-vol/_data", "Name": "nginx-vol", "Options": null, "Scope": "local" } ] [root@nccztsjb-node-01 ~]#
容器中的掛載情況,已經掛載到容器中的/data目錄上了
[root@nccztsjb-node-01 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES aeb3fbd6b431 172.20.58.152/middleware/nginx:1.21.4 "/docker-entrypoint.…" 7 minutes ago Up 7 minutes 80/tcp nginx.3.97x4izunap3rgdejsemzwe8pv [root@nccztsjb-node-01 ~]# docker exec -it aeb3fbd6b431 df -h Filesystem Size Used Avail Use% Mounted on overlay 49G 20G 27G 43% / tmpfs 64M 0 64M 0% /dev tmpfs 7.6G 0 7.6G 0% /sys/fs/cgroup shm 64M 0 64M 0% /dev/shm /dev/vda2 49G 20G 27G 43% /data tmpfs 7.6G 0 7.6G 0% /proc/acpi tmpfs 7.6G 0 7.6G 0% /proc/scsi tmpfs 7.6G 0 7.6G 0% /sys/firmware [root@nccztsjb-node-01 ~]#
OK,再來看bind 掛載的部分······
bind掛載
bind掛載,就是一個宿主機上的文件目錄。在task被調度到這個主機上的時候,必須要先有這個目錄纔行,這個是非常重要的一點!要十分的注意!
更加需要注意的是,如果集羣有多個節點,要確保每個節點上都要有這個目錄,因爲,task會調度到任意的節點,或重新被調度,如果沒有該目錄,調度就會失敗!無法最大化的利用集羣的能力!也就是調度的能力!
來看個示例
掛載讀寫的bind目錄
- 這裏的type是bind
- src是宿主機上的目錄
- dst是目標容器上的掛載目錄
docker service create \ --with-registry-auth \ --name=nginx \ --replicas=4 \ --publish published=8080,target=80 \ --mount type=bind,src=/data/nginxdata,dst=/data \ 172.20.58.152/middleware/nginx:1.21.4
如果宿主機上的目錄不存在,部署會失敗!
在每個節點,創建這個目錄
mkdir -p /data/nginxdata
service部署就正常了
[root@nccztsjb-node-01 ~]# docker service ls ID NAME MODE REPLICAS IMAGE PORTS hjtliru1qhmy nginx replicated 4/4 172.20.58.152/middleware/nginx:1.21.4 *:8080->80/tcp [root@nccztsjb-node-01 ~]# docker service ps nginx ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS uabtj2k6esws nginx.1 172.20.58.152/middleware/nginx:1.21.4 nccztsjb-node-01 Running Running 26 seconds ago uj3i2bbnpeh7 \_ nginx.1 172.20.58.152/middleware/nginx:1.21.4 nccztsjb-node-04 Shutdown Rejected 37 seconds ago "invalid mount config for type…" vrgxk1dnytoe \_ nginx.1 172.20.58.152/middleware/nginx:1.21.4 nccztsjb-node-04 Shutdown Rejected 42 seconds ago "invalid mount config for type…" kvylyopxi64x \_ nginx.1 172.20.58.152/middleware/nginx:1.21.4 nccztsjb-node-05 Shutdown Rejected 47 seconds ago "invalid mount config for type…" 4j7oqqq57ijn \_ nginx.1 172.20.58.152/middleware/nginx:1.21.4 nccztsjb-node-05 Shutdown Rejected 52 seconds ago "invalid mount config for type…" ji3uentc2bgj nginx.2 172.20.58.152/middleware/nginx:1.21.4 nccztsjb-node-01 Running Running 20 seconds ago lu4v0h7grbnv \_ nginx.2 172.20.58.152/middleware/nginx:1.21.4 nccztsjb-node-04 Shutdown Rejected 32 seconds ago "invalid mount config for type…" cb699gtqwud5 \_ nginx.2 172.20.58.152/middleware/nginx:1.21.4 nccztsjb-node-01 Shutdown Rejected 37 seconds ago "invalid mount config for type…" zqwnhvteobt1 \_ nginx.2 172.20.58.152/middleware/nginx:1.21.4 nccztsjb-node-01 Shutdown Rejected 42 seconds ago "invalid mount config for type…" gm2u2zf0blov \_ nginx.2 172.20.58.152/middleware/nginx:1.21.4 nccztsjb-node-02 Shutdown Rejected 47 seconds ago "invalid mount config for type…" 3fr37xdbcfr3 nginx.3 172.20.58.152/middleware/nginx:1.21.4 nccztsjb-node-01 Running Running 20 seconds ago tovkq5krz0wl \_ nginx.3 172.20.58.152/middleware/nginx:1.21.4 nccztsjb-node-02 Shutdown Rejected 32 seconds ago "invalid mount config for type…" 71mruquh4w7b \_ nginx.3 172.20.58.152/middleware/nginx:1.21.4 nccztsjb-node-05 Shutdown Rejected 37 seconds ago "invalid mount config for type…" w76hx98xxt5j \_ nginx.3 172.20.58.152/middleware/nginx:1.21.4 nccztsjb-node-05 Shutdown Rejected 42 seconds ago "invalid mount config for type…" 4hq6p8wdiksd \_ nginx.3 172.20.58.152/middleware/nginx:1.21.4 nccztsjb-node-01 Shutdown Rejected 47 seconds ago "invalid mount config for type…" m0jz3jtq24ex nginx.4 172.20.58.152/middleware/nginx:1.21.4 nccztsjb-node-01 Running Running 21 seconds ago llfevbb0053b \_ nginx.4 172.20.58.152/middleware/nginx:1.21.4 nccztsjb-node-05 Shutdown Rejected 32 seconds ago "invalid mount config for type…" s1au6l84btzl \_ nginx.4 172.20.58.152/middleware/nginx:1.21.4 nccztsjb-node-02 Shutdown Rejected 37 seconds ago "invalid mount config for type…" xn6ulpdzfa0y \_ nginx.4 172.20.58.152/middleware/nginx:1.21.4 nccztsjb-node-02 Shutdown Rejected 42 seconds ago "invalid mount config for type…" junisllhm4yu \_ nginx.4 172.20.58.152/middleware/nginx:1.21.4 nccztsjb-node-04 Shutdown Rejected 47 seconds ago "invalid mount config for type…" [root@nccztsjb-node-01 ~]#
綁定掛載的使用風險
綁定掛載可能很有用,但也可能導致問題。在大多數情況下,建議您在部署應用程序時不必從主機掛載路徑。
主要風險包括以下幾個方面:
- 需要在每個swarm節點創建目錄,因爲swarm調度器,有可能將容器調度任意的節點
- 如果服務容器變得不健康或不可達,Docker羣集模式調度程序可以隨時重新調度正在運行的服務容器。
- 主機綁定掛載是不可移植的。當您使用綁定掛載時,不能保證您的應用程序在開發中以與在生產中相同的方式運行。
so,建議在應用部署的時候,使用數據卷的掛載的方式!這就不需要考慮宿主機的目錄創建和管理!