Docker cloudstor:aws卷无法在EC2实例间迁移内容的求助
解决Docker Swarm + cloudstor:aws卷跨实例迁移数据的问题
我之前在AWS EC2集群上用Docker Swarm搭配cloudstor:aws插件时,也碰到过完全一样的问题——服务调度到新节点后,卷里的旧数据完全找不到,就像重新创建了个空卷一样!折腾了好一阵才搞明白问题出在哪,下面把我排查和解决的经验分享给你:
一、先确认cloudstor:aws插件的安装配置是否到位
首先得确保插件是按照AWS环境的要求正确安装的,尤其是EC2实例的IAM权限必须足够访问对应的存储服务(EBS或EFS),不然插件根本没法在节点间管理卷。
- 安装插件时一定要指定AWS区域,比如:
docker plugin install --alias cloudstor:aws docker4x/cloudstor:aws-x86_64-latest CLOUD_PLATFORM=AWS AWS_REGION=us-east-1 - 用
docker plugin ls检查插件状态,必须是enabled状态才正常。
二、创建卷时必须指定--scope=swarm参数
这是最容易踩的坑!如果创建卷时没加这个参数,卷默认是local scope,只能在创建它的那个节点上使用。当Swarm把服务调度到其他节点时,会自动创建一个新的同名空卷,自然看不到原来的数据。
- 手动创建卷的正确命令:
docker volume create -d cloudstor:aws --name my-db-volume --opt size=10 --scope=swarm - 如果用Compose文件定义,要在卷配置里明确指定scope:
volumes: my-db-volume: driver: cloudstor:aws driver_opts: size: "10" scope: "swarm"
三、检查服务的卷挂载配置
在Compose文件的服务部分,要确保挂载的是刚才创建的Swarm scope卷,而不是临时卷或者本地卷。比如数据库服务的配置:
services: postgres-db: image: postgres:14-alpine volumes: - my-db-volume:/var/lib/postgresql/data deploy: mode: replicated replicas: 1 # 这里不需要设置实例亲和性,Swarm会自动调度,卷会跟着服务走 environment: POSTGRES_PASSWORD: mysecretpassword
四、选对存储后端(EBS vs EFS)
cloudstor:aws支持两种存储后端,得根据你的服务场景选:
- 如果是单实例服务(比如单节点数据库),用EBS就够,但要确保卷是Swarm scope的,这样Swarm调度时会把EBS卷卸载旧节点、挂载到新节点。
- 如果是多实例共享数据的场景,必须用EFS,因为EBS只能挂载到一个EC2实例,而EFS可以同时挂载多个节点。指定EFS后端的话,创建卷时加
--opt backing=efs:docker volume create -d cloudstor:aws --name shared-app-data --opt backing=efs --scope=swarm
五、验证卷的迁移效果
配置好后,可以手动测试一下卷是否能跟着服务迁移:
- 先查看当前服务运行的节点:
docker service ps postgres-db - 强制把服务调度到其他节点:
docker service update --force --constraint-add node.hostname!=原节点主机名 postgres-db - 再次查看服务运行节点,然后登录新节点,用临时容器检查卷内容:
docker run --rm -v my-db-volume:/data busybox ls /data
最后还要提醒一句:确保EC2实例的安全组允许访问存储服务的端口,比如EFS需要开放NFS的2049端口,不然节点挂载卷会失败,服务启动也会出问题。
内容的提问来源于stack exchange,提问作者Marcos J.C Kichel
相关产品推荐
相关产品推荐

