Docker Swarm NFS 数据持久化存储

本文详细介绍了如何在DockerSwarm集群中部署NFS服务,并通过Volume和DockerStack两种方式实现数据共享。首先部署Swarm集群和NFS服务,然后创建DockerVolume并挂载到Swarm服务中,验证数据共享特性。接着,通过DockerStack简化操作,避免手动创建Volume,同样实现了NFS数据共享。文章最后提到了其他可选的持久化存储方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

mydockerswarm



一、Swarm 集群部署

可参考我前面的博客《基于 Linux 的 Docker Swarm 集群部署及应用》

本次实验:

  • master:192.168.56.142
  • work1:192.168.56.132
  • work2:192.168.56.180

二、NFS 服务部署

可参考我前面的博客《构建NFS-FTP文件共享存储》

本次实验:

  • NFS IP:192.168.56.141
  • Shared Dir:/data/sharedir

三、Swarm 使用 NFS

3.1 通过 Volume

3.1.1 创建 Volume

1、创建 Docker Volume

每个 swarm 节点均创建相同名称的 Docker Volume(名称为 nfsdata)

docker volume create --driver local \
  --opt type=nfs \
  --opt o=addr=192.168.56.141,rw \
  --opt device=:/data/sharedir \
  nfsdata

2、查看 Volume 是否创建成功

docker volume ls

# swarm集群节点依次进行验证

image-20230111144019356

3、查看 Volume 详情

docker volume inspect nfsdata

image-20230111144430328

其中:Mountpoint 为 Host 挂载点,Options 为 NFS 服务共享目录信息。

3.1.2 使用 Volume

1、在 docker swarm 的 master 节点执行创建服务操作

docker service create \
  --name nginx-nfs-test \
  --publish 1180:80 \
  --mount type=volume,source=nfsdata,destination=/data/web \
  --replicas 3 \
  nginx:1.20.2

2、查看 Service 部署情况

image-20230111145635747

3.1.3 验证数据共享特性

1、NFS 服务创建测试数据

image-20230111150058510

2、Service 验证是否共享 NFS 数据

image-20230111150309868

可见,数据被共享了,当然,你在容器中 /data/web 目录下产生的数据也会被持久化到 NFS 服务上。

当然,Nginx 也是正常运行的

image-20230111151444719

3.2 通过 Docker Stack

Docker Stack CLI

通过 Volume 方式,你会发现每台 swarm 集群 work 节点都需要创建 Volume(如果 master 节点也为 work 节点,也要创建 Volume )。稍显麻烦,我们可通过 Docker Stack 方式来弥补这点不足,也就是使用 Docker Stack 方式时,就不需要手动创建 Docker Volume 了。

3.2.1 创建 YAML 文件

参考:docker compose CLI

vim nginx-compose.yml

# 以下配置文件会创建一个名为myweb_nginx-nfs-test-1的service
# service命名规则:stack名_service名
version: "3"

services:
  nginx-nfs-test-1:
    image: nginx:1.20.2
    deploy:
      mode: replicated
      replicas: 3
      restart_policy:
        condition: on-failure
    ports:
      - "1181:80"
    networks:
      my-overlay-network:
        aliases:
          - nginx-test-net
    volumes:
      - "mountdata:/data/web"

volumes:
  mountdata:
    driver: local
    driver_opts:
      type: "nfs"
      o: "addr=192.168.56.141,rw"
      device: ":/data/sharedir"

networks:
  my-overlay-network:
    driver: overlay

如果你需要在指定的 Node 节点上运行 Service,可在配置文件中进行指定 Node 节点名(新增 placement 字段)。

version: "3"

services:
  nginx-nfs-test-1:
    image: nginx:1.20.2
    deploy:
      placement:
        constraints:
          - "node.hostname==harbor-nexus"
      mode: replicated
      replicas: 3
      restart_policy:
        condition: on-failure
    ...
    ...

除了可指定节点名外,还可以指定节点 ID、标签等。

3.2.2 使用 YAML 文件
docker stack deploy -c nginx-compose.yml myweb

# 创建一个名为myweb的stack

image-20230111155010050

查看 Service 所在集群节点

image-20230111155249105

3.2.3 验证数据共享特性

我在 3.1 小节中已经向 NFS 添加过测试数据了,现在来验证容器内部有没有测试数据。

docker exec -it myweb_nginx-nfs-test-1.2.dahr1c6am279qgnhf2910449c bash

image-20230111155733010

可见,数据已经同步到 swarm service 容器内部。

至此,Docker Swarm 的数据持久化问题已经解决。当然,除了 NFS 共享存储外,还有 Ceph、ClusterFS 等存储也能实现。实际生产中大家自行修改使用即可。


<think>好的,用户现在问的是如何进入Docker Swarm的容器。首先,我需要确认用户对Docker Swarm的基本了解程度。Docker SwarmDocker原生的集群管理工具,用户可能已经部署了服务,但需要进入容器进行调试或查看日志。 接下来,用户的问题是关于如何进入容器,这在Swarm模式下和单机Docker有所不同。在单机环境中,通常用`docker exec`,但在Swarm中,服务可能运行在多个节点上,容器名称是动态生成的,所以直接使用`docker exec`可能不太方便。 我需要分步骤解释。首先,用户需要确定要进入的容器名称或ID,这可能涉及到列出服务中的任务,然后找到对应的容器。然后,用户需要连接到运行该容器的节点,如果是多节点环境的话,可能需要SSH到那个节点,再执行`docker exec`命令。 另外,用户可能没有意识到Swarm模式下容器分布在不同的节点上,所以需要强调如何定位容器所在的节点。还有,动态容器名的问题,比如使用服务名和任务ID组合的命名方式,需要指导用户如何获取正确的容器名称。 可能用户的实际需求是调试或查看日志,所以可以建议使用`docker service logs`来查看日志,而不必进入容器。但如果必须进入容器,步骤需要明确,包括找到容器ID、定位节点、执行命令。 还需要注意权限问题,比如是否有权限访问节点,或者是否需要sudo来执行docker命令。此外,如果是短暂的任务容器,可能需要先确保容器处于运行状态,避免进入已经退出的容器。 最后,提醒用户在生产环境中谨慎使用进入容器的操作,可能会影响服务稳定性,建议尽量使用日志和监控工具。</think>以下是关于在Docker Swarm中进入容器的详细指南: --- ### 一、核心原理 **Swarm模式容器与单机Docker容器的关键区别**: 1. 容器名称由Swarm自动生成(格式:`<服务名称>.<任务ID>.<随机后缀>`) 2. 容器可能分布在集群的不同节点上 3. 直接使用`docker exec`需要先定位到具体节点 --- ### 二、标准操作流程 #### 步骤1:查看服务列表 ```bash docker service ls ``` 输出示例: ``` ID NAME MODE REPLICAS IMAGE a1b2c3d web_server replicated 3/3 nginx:latest ``` #### 步骤2:定位具体容器 ```bash # 查看服务任务分布(显示节点信息) docker service ps --no-trunc <SERVICE_NAME> # 示例输出: ID NAME IMAGE NODE DESIRED STATE CURRENT STATE d4e5f6a... web_server.1 nginx:latest node-02 Running Running 2 hours ago g7h8i9j... web_server.2 nginx:latest node-01 Running Running 2 hours ago ``` #### 步骤3:进入容器(需SSH到对应节点) ```bash # 连接到目标节点(示例为node-02) ssh user@node-02-ip # 在目标节点上列出容器 docker ps --filter name=<服务名称> # 进入容器 docker exec -it <CONTAINER_ID> /bin/bash ``` --- ### 三、快捷方法(单命令行操作) ```bash # 自动定位并进入第一个运行中的容器(需要jq工具) docker inspect $(docker service ps -q <SERVICE_NAME> | head -1) \ --format '{{.NodeID}} {{.Status.ContainerStatus.ContainerID}}' \ | xargs -I{} sh -c 'ssh $(docker node inspect --format "{{.Description.Hostname}}" {1}) \ "docker exec -it {2} sh"' ``` --- ### 四、特殊场景处理 #### 场景1:容器崩溃无法连接 ```bash # 强制创建新容器(调试模式) docker service update --force <SERVICE_NAME> # 立即查看新建容器ID watch -n 1 "docker service ps <SERVICE_NAME>" ``` #### 场景2:容器没有交互式shell ```bash # 直接执行命令(无需进入) docker exec <CONTAINER_ID> ls /app # 创建临时shell环境 docker exec -it <CONTAINER_ID> sh -c "exec sh" ``` --- ### 五、Swarm模式最佳实践 | 需求 | 推荐方案 | 优势 | |------|----------|------| | 调试日志 | `docker service logs --tail 50 -f <SERVICE_NAME>` | 实时查看所有副本日志 | | 批量操作 | `docker service update --env-add DEBUG=true <SERVICE_NAME>` | 集群级环境变量更新 | | 持久化存储 | 挂载NFS卷:`--mount type=volume,source=app_data,destination=/data,volume-driver=local,volume-opt=type=nfs,...` | 跨节点数据一致性 | --- ### 六、安全注意事项 1. **生产环境限制**: ```bash # 禁用交互式访问(通过服务约束) docker service create --name api \ --limit-memory 2g \ --constraint 'node.role != manager' \ --restart-condition any \ myapp:prod ``` 2. **审计追踪**: ```bash # 记录所有exec操作 dockerd --authorization-plugin=authz-broker \ --userns-remap=default ``` --- **关键提示**: 1. Swarm模式下优先使用`docker service logs`代替直接进入容器 2. 进入容器时应使用`sh`而不是`bash`(Alpine镜像等精简系统可能没有bash) 3. 修改容器文件系统后,需通过`docker commit`生成新镜像并更新服务
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云计算-Security

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值