Docker Swarm集群 使用NFS共享存储

安装NFS

系统环境为centos,一共有7台机子组成了Docker Swarm集群,每台机子都要安装NFS

IPDocker角色NFS角色
111.111.3.41ManagerServer
111.111.3.42ManagerClient
111.111.3.43ManagerClient
111.111.3.44WorkerClient
111.111.3.45ManagerClient
111.111.3.46ManagerClient
111.111.3.47WorkerClient

安装依赖

yum -y install nfs-utils

配置文件

使用111.111.3.41为NFS的服务端

先在/root目录下创建share文件夹,并赋予chmod 755权限

配置共享目录

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

生效配置

exportfs -rv

启动NFS服务

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

查看NFS服务状态

[root@KD111111003041 ~]#  rpcinfo -p
   program vers proto   port  service
    100000    4   tcp    111  portmapper
    100000    3   tcp    111  portmapper
    100000    2   tcp    111  portmapper
    100000    4   udp    111  portmapper
    100000    3   udp    111  portmapper
    100000    2   udp    111  portmapper
    100024    1   udp  45889  status
    100024    1   tcp  42518  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  37813  nlockmgr
    100021    3   udp  37813  nlockmgr
    100021    4   udp  37813  nlockmgr
    100021    1   tcp  40301  nlockmgr
    100021    3   tcp  40301  nlockmgr
    100021    4   tcp  40301  nlockmgr
[root@KD111111003041 ~]# cat /var/lib/nfs/etab
/root/share	111.111.3.0/24(rw,async,wdelay,hide,nocrossmnt,insecure,no_root_squash,no_all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=1000,anongid=1000,sec=sys,rw,insecure,no_root_squash,no_all_squash)

Docker Swarm中使用NFS

方式1:Docker Server 发布

创建Docker volume

每个docker节点都要手动创建相同名称的Docker volume

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

查看volume

[root@KD111111003041 ~]# docker volume ls
DRIVER              VOLUME NAME
local               app_foo_new
local               foo33
local               portainer_data

查看foo33的详细

[root@KD111111003041 ~]# docker volume inspect foo33
[
    {
        "CreatedAt": "2020-09-17T09:55:08+08:00",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/foo33/_data",
        "Name": "foo33",
        "Options": {
            "device": ":/root/share",
            "o": "addr=111.111.3.41,rw",
            "type": "nfs"
        },
        "Scope": "local"
    }
]

发布服务

在manager节点下创建服务

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

方式2:使用 docker stack 方发布

编写docker-compose.yml文档

version: '3.8'

services:

  nginx-test5:
    image: nginx:latest
    deploy:
      mode: replicated
      replicas: 3
      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=111.111.3.41,rw"
      device: ":/root/share"

networks:
  my-overlay-network:
    driver: overlay

使用docker stack编排方式,无需手动创建Docker volume

发布服务

将编写好的docker-compose.yml上传到是manager的机子上的任意目录下,然后在控制台转到对应的目录下输入命令

[root@KD111111003041 ~]# docker stack deploy -c docker-compose.yml app
Creating network app_my-overlay-network
Creating service app_nginx-test5
[root@KD111111003041 ~]#  docker stack ls
NAME                SERVICES            ORCHESTRATOR
app                 1                   Swarm
[root@KD111111003041 ~]# docker stack services app
ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
u02yjjdzt307        app_nginx-test5     replicated          3/3                 nginx:latest        *:88->80/tcp
[root@KD111111003041 ~]# docker service ps app_nginx-test5
ID                  NAME                IMAGE               NODE                               DESIRED STATE       CURRENT STATE           ERROR               PORTS
m246y53tmslk        app_nginx-test5.1   nginx:latest        KD111111003042.ppp-bb.dion.ne.jp   Running             Running 3 minutes ago                       
oxsyphx6qnvh        app_nginx-test5.2   nginx:latest        KD111111003047.ppp-bb.dion.ne.jp   Running             Running 3 minutes ago                       
nj4l0193yxrd        app_nginx-test5.3   nginx:latest        KD111111003044.ppp-bb.dion.ne.jp   Running             Running 3 minutes ago                       
[root@KD111111003041 ~]# 

参考文章:Docker Swarm 使用NFS数据共享

好的,针对您的问题,我来详细解答一下。 在 Docker Swarm 集群中,使用 overlay 网络可以实现跨主机的容器通信。在本次场景中,我们需要在 node2 上创建一个 NFS 服务器,并将 index.js 页面持久化到 NFS 服务器,以供三个 app.zip 的镜像使用。 下面是具体的步骤: 1. 创建 overlay 网络 在 Docker Swarm 集群中,我们可以通过命令行或者 Docker Compose 文件创建 overlay 网络。这里我们以命令行为例,使用以下命令创建 overlay 网络: ``` docker network create -d overlay my-overlay ``` 2. 创建 NFS 服务器 在 node2 主机上,我们可以使用 Docker 镜像创建 NFS 服务器。具体命令如下: ``` docker run -d --name nfs-server --privileged -v /data/nfs:/nfsshare itsthenetwork/nfs-server-alpine:latest /bin/sh -c "/etc/init.d/nfs-server start && echo '/nfsshare *(rw,no_subtree_check,no_root_squash)' >> /etc/exports && /bin/sh" ``` 这里我们将 NFS 服务器的共享目录设置为 /data/nfs,可以根据实际情况进行修改。同时,我们将 NFS 服务器运行在一个 Docker 容器中,使用 itsthenetwork/nfs-server-alpine 镜像。 3. 将 index.js 页面持久化到 NFS 服务器 在 node2 主机上,我们需要将 index.js 页面持久化到 NFS 服务器上,以供三个 app.zip 的镜像使用。具体命令如下: ``` echo "Hello World" > /data/nfs/index.js ``` 这里我们将 index.js 页面内容设置为 "Hello World",可以根据实际情况进行修改。 4. 运行三个 app.zip 的镜像 在 Docker Swarm 集群中,我们可以通过编写 Docker Compose 文件来管理多个容器。这里我们将三个 app.zip 的镜像运行在 Docker Swarm 集群中,并使用 overlay 网络进行通信。具体 Docker Compose 文件内容如下: ``` version: "3" services: app1: image: app.zip deploy: replicas: 1 volumes: - type: volume source: nfs target: /app networks: - my-overlay command: ["/bin/sh", "-c", "while true; do sleep 1; done"] app2: image: app.zip deploy: replicas: 1 volumes: - type: volume source: nfs target: /app networks: - my-overlay command: ["/bin/sh", "-c", "while true; do sleep 1; done"] app3: image: app.zip deploy: replicas: 1 volumes: - type: volume source: nfs target: /app networks: - my-overlay command: ["/bin/sh", "-c", "while true; do sleep 1; done"] volumes: nfs: driver: local driver_opts: type: nfs o: addr=node2,vers=4,nolock,soft,rw device: ":/data/nfs" networks: my-overlay: driver: overlay ``` 这里我们创建了三个 app.zip 的镜像,并将它们运行在 Docker Swarm 集群中。同时,我们将 NFS 服务器的共享目录挂载到容器的 /app 目录中,以便容器可以访问其中的 index.js 页面。最后,我们使用 overlay 网络进行容器间的通信。 5. 验证容器的轮询效果 在 Docker Swarm 集群中,我们可以使用 Docker CLI 或者 Portainer 等工具来查看容器的运行情况。在本次场景中,我们可以使用以下命令查看容器的运行情况: ``` docker service ls docker service ps <service_name> ``` 这里的 service_name 指的是 Docker Compose 文件中定义的服务名称。例如,我们可以使用以下命令查看 app1 服务的运行情况: ``` docker service ps app1 ``` 如果一切正常,我们可以看到三个容器在不同的节点上运行,并且它们会轮流访问 NFS 服务器上的 index.js 页面。 至此,我们就完成了在 Docker Swarm 集群使用 overlay 网络,在 node2 上创建 NFS 服务器运行三个 app.zip 的镜像,并实现了容器的轮询效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值