如何在swarm的service中使用volume或者bind 掛載?

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,建議在應用部署的時候,使用數據卷的掛載的方式!這就不需要考慮宿主機的目錄創建和管理!

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章