Docker Swarm 使用NFS數(shù)據(jù)共享

主要解決在集群中不同主機(jī)之間的容器數(shù)據(jù)共享,當(dāng)前以單主機(jī)的nfs為例,你也可以搭建分布式文件系統(tǒng)
docker swarm 集群的搭建請(qǐng)看前面的文章Docker Swarm集成搭建

1. 搭建nfs

  • centos 7 系統(tǒng)

1.1. 安裝

yum -y install nfs-utils rpcbind

1.2. 配置文件

nfs 的配置文件 /etc/expots
共享目錄賦予權(quán)限:chmod 755 /home/data

vim /etc/exports
/root/share 172.16.10.0/24(rw,async,insecure,anonuid=1000,anongid=1000,no_root_squash)

配置生效

exportfs -rv

配置文件說明:

/root/share 為共享目錄

* 192.168.1.0/24 可以為一個(gè)網(wǎng)段,一個(gè)IP,也可以是域名,域名支持通配符 如: *.com
* rw:read-write,可讀寫;
* ro:read-only,只讀;
* sync:文件同時(shí)寫入硬盤和內(nèi)存;
* async:文件暫存于內(nèi)存,而不是直接寫入內(nèi)存;
* no_root_squash:NFS客戶端連接服務(wù)端時(shí)如果使用的是root的話,那么對(duì)服務(wù)端分享的目錄來說,也擁有root權(quán)限。顯然開啟這項(xiàng)是不安全的。
* root_squash:NFS客戶端連接服務(wù)端時(shí)如果使用的是root的話,那么對(duì)服務(wù)端分享的目錄來說,擁有匿名用戶權(quán)限,通常他將使用nobody或nfsnobody身份;
* all_squash:不論NFS客戶端連接服務(wù)端時(shí)使用什么用戶,對(duì)服務(wù)端分享的目錄來說都是擁有匿名用戶權(quán)限;
* anonuid:匿名用戶的UID值
* anongid:匿名用戶的GID值。備注:其中anonuid=1000,anongid=1000,為此目錄用戶web的ID號(hào),達(dá)到連接NFS用戶權(quán)限一致。
* defaults 使用默認(rèn)的選項(xiàng)。默認(rèn)選項(xiàng)為rw、suid、dev、exec、auto nouser與async。
* atime 每次存取都更新inode的存取時(shí)間,默認(rèn)設(shè)置,取消選項(xiàng)為noatime。
* noatime 每次存取時(shí)不更新inode的存取時(shí)間。
* dev 可讀文件系統(tǒng)上的字符或塊設(shè)備,取消選項(xiàng)為nodev。
* nodev 不讀文件系統(tǒng)上的字符或塊設(shè)備。
* exec 可執(zhí)行二進(jìn)制文件,取消選項(xiàng)為noexec。
* noexec 無法執(zhí)行二進(jìn)制文件。
* auto 必須在/etc/fstab文件中指定此選項(xiàng)。執(zhí)行-a參數(shù)時(shí),會(huì)加載設(shè)置為auto的設(shè)備,取消選取為noauto。
* noauto 無法使用auto加載。
* suid 啟動(dòng)set-user-identifier設(shè)置用戶ID與set-group-identifer設(shè)置組ID設(shè)置位,取消選項(xiàng)為nosuid。
* nosuid 關(guān)閉set-user-identifier設(shè)置用戶ID與set-group-identifer設(shè)置組ID設(shè)置位。
* user 普通用戶可以執(zhí)行加載操作。
* nouser 普通用戶無法執(zhí)行加載操作,默認(rèn)設(shè)置。
* remount 重新加載設(shè)備。通常用于改變?cè)O(shè)備的設(shè)置狀態(tài)。
* rsize 讀取數(shù)據(jù)緩沖大小,默認(rèn)設(shè)置1024。–影響性能
* wsize 寫入數(shù)據(jù)緩沖大小,默認(rèn)設(shè)置1024。
* fg 以前臺(tái)形式執(zhí)行掛載操作,默認(rèn)設(shè)置。在掛載失敗時(shí)會(huì)影響正常操作響應(yīng)。
* bg 以后臺(tái)形式執(zhí)行掛載操作。
* hard 硬式掛載,默認(rèn)設(shè)置。如果與服務(wù)器通訊失敗,讓試圖訪問它的操作被阻塞,直到服務(wù)器恢復(fù)為止。
* soft 軟式掛載。服務(wù)器通訊失敗,讓試圖訪問它的操作失敗,返回一條出錯(cuò)消息。這項(xiàng)功能對(duì)于避免進(jìn)程掛在無關(guān)緊要的安裝操作上來說非常有用。
* retrans=n 指定在以軟方式安裝的文件系統(tǒng)上,在返回一條出錯(cuò)消息之前重復(fù)發(fā)出請(qǐng)求的次數(shù)。
* nointr 不允許用戶中斷,默認(rèn)設(shè)置。
* intr 允許用戶中斷被阻塞的操作并且讓它們返回一條出錯(cuò)消息。
* timeo=n 設(shè)置請(qǐng)求的超時(shí)時(shí)間以十分之一秒為單位。
* tcp 傳輸默認(rèn)使用udp,可能出現(xiàn)不穩(wěn)定,使用proto=tcp更改傳輸協(xié)議??蛻舳藚⒖糾ountproto=netid

1.3. 啟動(dòng)nfs服務(wù)

systemctl enable rpcbind
systemctl start rpcbind
systemctl enable nfs-server
systemctl start nfs-server

確認(rèn)NFS服務(wù)器啟動(dòng)成功

[root@master opt]# rpcinfo -p
   program vers proto   port  service
    100024    1   udp  50813  status
    100024    1   tcp   6021  status
    100005    1   udp  20048  mountd
    100005    1   tcp  20048  mountd
    100005    2   udp  20048  mountd
    100005    2   tcp  20048  mountd
    100005    3   udp  20048  mountd
    100005    3   tcp  20048  mountd
    100003    3   tcp   2049  nfs
    100003    4   tcp   2049  nfs
    100227    3   tcp   2049  nfs_acl
    100003    3   udp   2049  nfs
    100003    4   udp   2049  nfs
    100227    3   udp   2049  nfs_acl
    100021    1   udp  35715  nlockmgr
    100021    3   udp  35715  nlockmgr
    100021    4   udp  35715  nlockmgr
    100021    1   tcp   5350  nlockmgr
    100021    3   tcp   5350  nlockmgr
    100021    4   tcp   5350  nlockmgr
[root@master opt]# cat /var/lib/nfs/etab
/root/share 172.16.10.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=1000,anongid=1000,sec=sys,rw,secure,root_squash,all_squash)

2. 將nfs應(yīng)用到docker swarm中

在現(xiàn)有的集群中

IP 角色
172.16.10.172 master
172.16.10.173 node1
172.16.10.174 node2

2.1. 以手動(dòng)創(chuàng)建docker service的方式

先手動(dòng)創(chuàng)建docker volume volume_create/#examples

docker volume create --driver local \
    --opt type=nfs \
    --opt o=addr=172.16.10.172,rw \
    --opt device=:/root/share \
    foo33

--opt device=:/root/share 指向共享目錄,也可以是共享目錄下的子目錄

查看一下volume

[root@master share]# docker volume ls
DRIVER              VOLUME NAME
local               4c1cbdd6e3d41d1a1d51947b2790d85ed43633de5f1b67d49c178277fa7eff08
local               681da6e4b4207705fd8a3b8da280cbec12d284e626b548bea8af0db5522b72db
local               682ad60281ad3e68321f3a7828c7ad2df8873a68d2f94ee602700498392fb252
local               efb6b51422ec168075cc207e7d7e01a7cec65cda6736b4ba8d2617213a258eff
local               elk_esdata
local               f5ce2d5d45b11d745e85633e87a7ba38fab09afcde5cda0291bb6cfa84da010c
local               f7c089ebff176bb98b5055d5762bc07c110f67cec74d87f4496e88cb3acaae27
local               f6497e59073da936a28bdc1ba646390f9ef937551ee6bbeaa72db3b851114bbb
local               faa50b0f8bfccd96362b7306af57ccb79ef2bf6fceba9720f4bd0c45bb842f4f
local               foo2
local               foo33
local               myvol2

看到了docker volume列表中有foo33,查看volume詳細(xì)

[root@master share]# docker volume inspect foo33
[
    {
        "CreatedAt": "2019-01-15T11:13:45+08:00",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/foo33/_data",
        "Name": "foo33",
        "Options": {
            "device": ":/root/share",
            "o": "addr=172.16.10.172,rw",
            "type": "nfs"
        },
        "Scope": "local"
    }
]

可以看出nfs 的/root/share 被掛載到了當(dāng)前主要的 /var/lib/docker/volumes/foo33/_data

這里有個(gè)問題,如果不用docker compose創(chuàng)建服務(wù)的話,你必須在服務(wù)所在的節(jié)點(diǎn)上創(chuàng)建docker volume
我的服務(wù)要?jiǎng)?chuàng)建3個(gè)副本,服務(wù)可能會(huì)分布到三個(gè)主機(jī)上,那么我在三個(gè)主機(jī)上都創(chuàng)建docker volume create foo33使用上面的代碼在其它兩臺(tái)主機(jī)上都執(zhí)行一遍

[root@node2 ~]# docker volume ls
DRIVER              VOLUME NAME
省略... 
local               foo33
省略...
[root@node1 share]# docker volume ls
DRIVER              VOLUME NAME
省略... 
local               foo33
省略...

然后發(fā)布服務(wù)

docker service create \
  --name test-nginx-nfs \
  --publish 84:80 \
  --mount type=volume,source=foo33,destination=/app/share \
  --replicas 3 \
  nginx

服務(wù)名 test-nginx-nfs 把foo33安裝到容器的/app/share目錄中

[root@master share]# docker service create   --name test-nginx-nfs   --publish 84:80   --mount type=volume,source=foo33,destination=/app/share   --replicas 3   nginx
ska2oere0k3e6kbi6i5a5hnfa
overall progress: 3 out of 3 tasks
1/3: running   [==================================================>]
2/3: running   [==================================================>]
3/3: running   [==================================================>]
verify: Service converged

查看服務(wù)分布的節(jié)點(diǎn):

[root@master share]# docker service ps test-nginx-nfs
ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE            ERROR               PORTS
xgpgfgfk7jo4        test-nginx-nfs.1    nginx:latest        node2               Running             Running 47 seconds ago
xy8do6go0nrn        test-nginx-nfs.2    nginx:latest        node1               Running             Running 47 seconds ago
56zfy845yxo3        test-nginx-nfs.3    nginx:latest        master              Running             Running 46 seconds ago

抽一個(gè)節(jié)點(diǎn)看 node1
我在nfs服務(wù)搭建成功后在/root/share目錄中放了一個(gè)文件名叫index.html的文件

[root@master share]# pwd
/root/share
[root@master share]# ls
index.html

node1
查看宿主機(jī)掛載目錄

[root@node1 /]# docker volume inspect foo33
[
    {
        "CreatedAt": "2019-01-15T11:13:45+08:00",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/foo33/_data",
        "Name": "foo33",
        "Options": {
            "device": ":/root/share",
            "o": "addr=172.16.10.172,rw",
            "type": "nfs"
        },
        "Scope": "local"
    }
]
[root@node1 /]# cd /var/lib/docker/volumes/foo33/_data
[root@node1 _data]# ls
index.html
[root@node1 _data]#

查看容器目錄

[root@node1 share]# docker ps
CONTAINER ID        IMAGE                   COMMAND                  CREATED             STATUS              PORTS                                                 NAMES
e81de34902f4        nginx:latest            "nginx -g 'daemon of…"   10 seconds ago      Up 8 seconds        80/tcp                                                test-nginx-nfs.2.ed05o9nezwpppw8ov7jtvjagv
bf5550586e1e        rabbitmq:3-management   "docker-entrypoint.s…"   7 weeks ago         Up 7 weeks          4369/tcp, 5671-5672/tcp, 15671-15672/tcp, 25672/tcp   rabbit_rabbit3.1.3vn2fjjux9jtaeclutiietzys
[root@node1 share]# docker exec -it e81de34902f4 bash
root@e81de34902f4:/# cd app/share/
root@e81de34902f4:/app/share# ls
index.html
root@e81de34902f4:/app/share#

2.2. 使用 編排的方式發(fā)布service

docker compose文檔

version: '3.3'

services:

  nginx-test5:
    image: nginx:latest
    deploy:
      mode: replicated
      replicas: 1
      restart_policy:
        condition: on-failure
    ports:
      - "88:80"
    networks:
      my-overlay-network:
        aliases:
          - nginx-test5
    volumes:
      - "foo_new:/app/share"


volumes:
  foo_new:
    driver: local
    driver_opts:
      type: "nfs"
      o: "addr=172.16.10.172,rw"
      device: ":/root/share"

networks:
  my-overlay-network:
    driver: overlay

使用docker compose編排不需要分別在每一個(gè)主機(jī)上手動(dòng)創(chuàng)建docker volume

發(fā)布服務(wù)

[root@master opt]# docker stack deploy -c docker-compose.yml app
Creating network app_my-overlay-network
Creating service app_nginx-test5
[root@master opt]# docker stack ls
NAME                SERVICES            ORCHESTRATOR
app                 1                   Swarm
rabbit              3                   Swarm
[root@master opt]# docker stack services app
ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
ighafroycq0c        app_nginx-test5     replicated          3/3                 nginx:latest        *:88->80/tcp
[root@master opt]# docker service ps app_nginx-test5
ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE            ERROR               PORTS
54gdcmfxh218        app_nginx-test5.1   nginx:latest        master              Running             Running 13 seconds ago
jt2v0mlgqwup        app_nginx-test5.2   nginx:latest        node2               Running             Running 15 seconds ago
z039pxqu4sbl        app_nginx-test5.3   nginx:latest        node1               Running             Running 14 seconds ago
[root@master opt]#

查看docker volume

[root@master opt]# docker volume ls
DRIVER              VOLUME NAME
省略......
local               app_foo_new
local               foo33
local               myvol2
local               test-vol
[root@master opt]# docker volume inspect app_foo_new
[
    {
        "CreatedAt": "2019-01-15T11:13:45+08:00",
        "Driver": "local",
        "Labels": {
            "com.docker.stack.namespace": "app"
        },
        "Mountpoint": "/var/lib/docker/volumes/app_foo_new/_data",
        "Name": "app_foo_new",
        "Options": {
            "device": ":/root/share",
            "o": "addr=172.16.10.172,rw",
            "type": "nfs"
        },
        "Scope": "local"
    }
]
[root@master opt]#

抽查一個(gè)看看node2

查看本機(jī)掛載:

[root@node2 ~]# docker volume ls
DRIVER              VOLUME NAME
省略......
local               app_foo_new
local               foo2
local               foo33
local               myvol2
local               test-vol
[root@node2 ~]# docker volume inspect app_foo_new
[
    {
        "CreatedAt": "2019-01-15T11:13:45+08:00",
        "Driver": "local",
        "Labels": {
            "com.docker.stack.namespace": "app"
        },
        "Mountpoint": "/var/lib/docker/volumes/app_foo_new/_data",
        "Name": "app_foo_new",
        "Options": {
            "device": ":/root/share",
            "o": "addr=172.16.10.172,rw",
            "type": "nfs"
        },
        "Scope": "local"
    }
]
[root@node2 ~]# cd /var/lib/docker/volumes/app_foo_new/_data
[root@node2 _data]# ls
index.html
[root@node2 ~]#

查看容器:

[root@node2 _data]# docker ps
CONTAINER ID        IMAGE                   COMMAND                  CREATED             STATUS              PORTS                                                 NAMES
7e333092c3cf        nginx:latest            "nginx -g 'daemon of…"   5 minutes ago       Up 5 minutes        80/tcp                                                app_nginx-test5.2.jt2v0mlgqwupvv5lag7epriwo
91d318ee2b04        rabbitmq:3-management   "docker-entrypoint.s…"   7 weeks ago         Up 7 weeks          4369/tcp, 5671-5672/tcp, 15671-15672/tcp, 25672/tcp   rabbit_rabbit2.1.ykbawm133w4c9rzsrmlm9mkhp
[root@node2 _data]# docker exec -it 7e333092c3cf bash
root@7e333092c3cf:/# cd app/share/
root@7e333092c3cf:/app/share# ls
index.html
root@7e333092c3cf:/app/share#

總結(jié):環(huán)境配置比較簡單,難的是nfs服務(wù)的讀寫,隨著業(yè)務(wù)和流量的增加,讀寫量增大,可能需要分布式的文件系統(tǒng),分布式的文件系統(tǒng)又改如何何理的使用

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容