1. 程式人生 > >Docker集群管理Swarm數據持久化

Docker集群管理Swarm數據持久化

重啟 3.1 重要 格式 dock 啟動 eat null .com

一、前言

  和docker容器一樣,Swarm集群中運行的服務也能夠做數據持久化。我們可以通過volume、bind和nfs等方式來實現swarm集群應用數據的持久化。其實和docker數據持久化的形式是一樣的。

二、系統環境

節點名稱 IP 操作系統 內核版本
manager 172.16.60.95 CentOs7 4.16.1-1.el7.elrepo.x86_64
node-01 172.16.60.96 CentOs7 4.16.1-1.el7.elrepo.x86_64
node-02 172.16.60.97 CentOs7 4.16.1-1.el7.elrepo.x86_64
node-03 172.16.60.98 CentOs7 4.16.1-1.el7.elrepo.x86_64

三、通過volume實現數據持久化

  3.1 volume說明

  卷是繞過聯合文件系統的一個或多個容器內的特定目錄。 卷被設計為保持數據,與容器的生命周期無關。 因此,Docker在刪除容器時不會自動刪除卷,也不會“垃圾收集”不再由容器引用的卷。 也稱為:數據卷。

  需要更詳細了解volume可參考官方文檔:https://docs.docker.com/storage/volumes/

  3.2 使用格式

docker service create --replicas 1或2或3... --name SERVICE-NAME --mount type=volume,src=<VOLUME-NAME>,dst=<CONNTAINER-PATH> <IMAGE>

  3.3 創建服務的volume

When you start a service and define a volume, each service container uses its own local volume. 
None of the containers can share this data if you use the local volume driver, but some volume drivers do support shared storage.
 Docker for AWS and Docker for Azure both support persistent storage using the Cloudstor plugin.

使用service的方式創建的volume數據卷,該service中的容器只會使用其所在節點服務器的中的volume。
當使用本地數據卷驅動時,所用的容器都無法共享其數據。
但是有一些數據卷驅動支持共享存儲。

  1)創建數據卷

[root@manager ~]# docker service create --replicas 5 --name my-web --mount type=volume,src=nginx-vol,dst=/data nginx

nsrkogg0x5t617qszxylv6rfn
overall progress: 5 out of 5 tasks 
1/5: running   [==================================================>] 
2/5: running   [==================================================>] 
3/5: running   [==================================================>] 
4/5: running   [==================================================>] 
5/5: running   [==================================================>] 
verify: Service converged


參數說明:

--replicas:創建5個nginx副本;
--name:自定義名稱為my-web;
--mount:掛載類型為volume;
src:src掛載源為nginx-vol,相當於執行了docker volume nginx-vol;
dst:dst掛載目的路徑為nginx容器中的路徑/data;
nginx:通過nginx鏡像來運行;

  

  2)查看創建的副本

[root@manager ~]# docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
nsrkogg0x5t6        my-web              replicated          5/5                 nginx:latest        
[root@manager ~]# docker service ps my-web
ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE           ERROR               PORTS
sv6ho8p1ngoo        my-web.1            nginx:latest        manager             Running             Running 2 minutes ago                       
p601cxw8x5gr        my-web.2            nginx:latest        node-02             Running             Running 2 minutes ago                       
qcgdyxkwzk00        my-web.3            nginx:latest        node-03             Running             Running 2 minutes ago                       
9adosd6zoaeb        my-web.4            nginx:latest        node-01             Running             Running 2 minutes ago                       
jjv4if4glv4b        my-web.5            nginx:latest        manager             Running             Running 2 minutes ago

  

  3)查看數據卷、掛載的數據

在每個有task節點上都會自動創建一個nginx-vol的數據卷

# manager 節點
[root@manager ~]# docker volume ls
DRIVER              VOLUME NAME
local               nginx-vol

# 工作節點
[root@node-02 ~]# docker volume ls
DRIVER              VOLUME NAME
local               nginx-vol

  在通過docker volume inspect nginx-vol可以看到nginx-vol卷自動掛載到了/var/lib/docker/volumes/nginx-vol/_data目錄下

[root@manager ~]# docker volume inspect nginx-vol
[
    {
        "CreatedAt": "2018-04-11T18:08:32+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/nginx-vol/_data",
        "Name": "nginx-vol",
        "Options": {},
        "Scope": "local"
    }
]

  

  4)本地數據卷驅動數據不能共享

本地數據卷驅動創建的數據卷nginx-vol,其持久化的數據只能被本節點上service中的容器使用。在不同節點的數據卷中新建不同的文件,查看每個容器讀取文件的情況:

# 在/var/lib/docker/volumes/nginx-vol/_data 新建文件


# manager: manager.txt
root@9590af9e71f5:/data# ls
manager.txt


# node-01: node-01.txt
root@d5d785dbcdba:/data# ls
node-01.txt

......

其余節點是一樣的,所以每個容器只能使用本節點數據卷中的內容

  

四、Swarm 共享存儲NFS

  當構建一個有容錯機制的應用時,有一些數據或文件需要共享到各個節點服務的容器中,有多種方法可以實現,其中一種就是外部存儲系統,比如NFS或者Amazon S3。

  技術分享圖片

  4.1 安裝nfs

所以節點安裝

yum -y install nfs-utils

# 在manager節點上啟動nfs服務端
[root@manager ~]# systemctl enable nfs

[root@manager ~]# systemctl start nfs

# 工作節點上啟動nfs客戶端
systemctl start rpcbind

  4.2 在manager節點上配置nfs

# 創建目錄
[root@manager ~]# mkdir -p /data/nfs_vol

# 設置nfs
vim /etc/exports

# swarm nfs share volume
/data/nfs_vol 172.16.60.0/24(rw,sync,no_root_squash)   
 
/data/nfs_vol : 共享的目錄
172.16.60.0/24 : 可以訪問的主機網段
rw : 可讀寫權限,只讀權限ro
sync : 同步,數據更安全,速度慢
async : 異步,速度快,效率高,安全性低
no_root_squash :NFS 服務共享的目錄的屬性, 如果用戶是root, 對這個目錄就有root的權限

# 重啟nfs
[root@manager data]# systemctl restart nfs 

  4.3 測試掛載nfs共享目錄 

在node-01節點

[root@node-01 ~]# mount -t nfs 172.16.60.95:/data/nfs_vol /tmp
[root@node-01 tmp]# touch a.txt
[root@node-01 tmp]# ls
a.txt


# 在manager節點查看
[root@manager ~]# ls /data/nfs_vol/
a.txt


#可以,umount 掉
[root@node-01 ~]# umount /tmp

  4.4 使用nfs volume創建服務

  1)創建服務

[root@manager ~]# docker service create \
--replicas 5 \
--name my-nginx \
-p 80:80 \
--mount ‘type=volume,src=nfs-vol,dst=/usr/share/nginx/html,volume-driver=local,volume-nocopy=true,volume-opt=type=nfs,volume-opt=device=172.16.60.95:/data/nfs_vol,"volume-opt=o=addr=172.16.60.95,vers=4,soft,timeo=180,bg,tcp,rw"‘ \
nginx

  如果遇到報錯: 

1/5: failed to chmod on /var/lib/docker/volumes/nfs-vol/_data: chmod /var/lib/d… 
2/5: failed to chmod on /var/lib/docker/volumes/nfs-vol/_data: chmod /var/lib/d… 
3/5: failed to chmod on /var/lib/docker/volumes/nfs-vol/_data: chmod /var/lib/d… 
4/5: failed to chmod on /var/lib/docker/volumes/nfs-vol/_data: chmod /var/lib/d… 
5/5: failed to chmod on /var/lib/docker/volumes/nfs-vol/_data: chmod /var/lib/d…


# 加一個參數
volume-nocopy=true  

  2)查看服務

[root@manager ~]# docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
7xfkk34fs23o        my-nginx            replicated          5/5                 nginx:latest        *:80->80/tcp
[root@manager ~]# docker service ps my-nginx
ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE           ERROR               PORTS
tmb0ifqwwiys        my-nginx.1          nginx:latest        manager             Running             Running 2 minutes ago                       
1899caz2mpuc        my-nginx.2          nginx:latest        node-01             Running             Running 2 minutes ago                       
o25ssf6zsbzo        my-nginx.3          nginx:latest        node-03             Running             Running 2 minutes ago                       
uhj1otbqw1ph        my-nginx.4          nginx:latest        node-03             Running             Running 2 minutes ago                       
jna7v8v6k1vm        my-nginx.5          nginx:latest        node-02             Running             Running 2 minutes ago 

  3)查看數據卷

[root@manager ~]# docker volume ls
DRIVER              VOLUME NAME
local               nfs-vol

  和volume一樣,每個分配task的節點上都會有這個nfs-vol的數據卷

  4)測試共享性

#剛才將數據卷掛載到了nginx的默認web目錄/usr/share/nginx/html,是可以直接訪問其中靜態文件的

1. 在manager節點/var/lib/docker/volumes/nfs-vol/_data 新建 a.txt

2. 在node-01 /var/.../_data 中修改a.txt
    It‘s nfs volume test.

3.訪問測試

  技術分享圖片

  測試表明節點間可以通過nfs volume實現數據共享。

五、使用bind方式持久化數據

  5.1 bind說明

  Docker早期就支持這個特性。與volumes相比,Bind mounts支持的功能有限。使用bind mounts時,宿主機上的一個文件或目錄被掛載到容器上。 

警告:使用Bind mounts的一個副作用是,容器中運行的程序可以修改宿主機的文件系統,
   包括創建,修改,刪除重要的系統文件或目錄。這個功能可能會有安全問題。

  詳細了解可參考官方文檔:https://docs.docker.com/storage/bind-mounts/

  5.2 使用格式  

1. 讀寫掛載格式

#docker service create --replicas 1或2或3... --name SERVICE-NAME --mount type=bind,src=<VOLUME-NAME>,dst=<CONNTAINER-PATH> <IMAGE>

2.只讀掛載格式

#docker service create --replicas 1或2或3... --name SERVICE-NAME --mount type=bind,src=<VOLUME-NAME>,dst=<CONNTAINER-PATH>,ro  <IMAGE>

  5.3 創建服務

  1)創建掛載目錄 

# 在每個節點上創建
 mkdir -p /data/bind_vol

  2)使用bind形式創建服務

[root@manager ~]# docker service create > --replicas 5 > --name my-web > -p 80:80 > --mount type=bind,src=/data/bind_vol,dst=/usr/share/nginx/html > nginx
yt7gsouyw6zcdp13tay3f5eu4
overall progress: 5 out of 5 tasks 
1/5: running   
2/5: running   
3/5: running   
4/5: running   
5/5: running   
verify: Service converged

  整個形式和volume是差不多的,只不過需要指定目錄路徑。同樣各個節點之間的數據不共享,每個容器只能使用本節點中數據卷中的內容。

Docker集群管理Swarm數據持久化