使用Docker持久化卷启动YugabyteDB时出现Socket绑定错误
解决Docker中YugabyteDB复用持久化卷启动失败的问题
问题原因
首次启动容器时,YugabyteDB会把当前容器的IP(示例中的172.28.0.3)写入持久化卷内的配置文件或元数据中。重新创建容器时,Docker默认会分配新的IP地址,此时YugabyteDB仍尝试绑定旧IP的7100端口,导致出现Cannot assign requested address (system error 99)的绑定失败错误。
解决方案
方案1:清理持久化卷中的旧IP配置
- 停止并删除故障容器:
docker stop yugabytedb && docker rm yugabytedb
- 定位持久化卷的挂载路径(以named volume为例):
docker volume inspect yb-data | grep Mountpoint
- 进入挂载路径,删除master节点的元数据文件(这些文件保存了旧IP信息):
rm -rf /path/to/mountpoint/yb-data/master/*
- 重新启动容器,YugabyteDB会根据新容器的IP重新生成配置。
方案2:启动时强制监听所有地址
启动容器时添加参数,让YugabyteDB监听容器内所有可用IP,避免绑定固定旧IP:
docker run -d --name yugabytedb -v yb-data:/yb-data yugabytedb/yugabyte:latest \ yugabyted start --daemon=false \ --master-rpc-bind-addresses 0.0.0.0:7100 \ --tserver-rpc-bind-addresses 0.0.0.0:9100 \ --listen 0.0.0.0
方案3:给容器分配固定IP
创建自定义Docker网络并指定固定IP,确保容器重启后IP不变:
- 创建自定义网络:
docker network create --subnet=172.28.0.0/16 yb-network
- 使用固定IP启动容器:
docker run -d --name yugabytedb --net yb-network --ip 172.28.0.3 -v yb-data:/yb-data \ yugabytedb/yugabyte:latest yugabyted start --daemon=false
错误日志参考
./../src/yb/master/master_main.cc:131] Network error (yb/util/net/socket.cc:325): Error binding socket to 172.28.0.3:7100: Cannot assign requested address (system error 99) @ 0x2938618 google::LogMessage::SendToLog() @ 0x29394d3 google::LogMessage::Flush() @ 0x29399cf google::LogMessageFatal::~LogMessageFatal() @ 0x2677cde main @ 0x7fb112f46825 __libc_start_main @ 0x260802e _start
内容的提问来源于stack exchange,提问作者dh YB
相关产品推荐
相关产品推荐

