使用YugabyteDB与Docker持久化卷时出现地址分配失败问题
问题现象
首次运行挂载持久化卷的YugabyteDB Docker容器时一切正常,但重新创建容器并复用现有卷后,容器启动失败,报错如下:
master.err :
./../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
根因分析
持久化卷内的yb-data/conf/yugabyted.conf文件中,advertise_address字段记录了旧容器的IP地址(例如"advertise_address": "172.28.0.3")。重新创建容器后,Docker会分配新IP,但YugabyteDB启动时仍读取旧配置里的IP尝试绑定,导致端口绑定失败。
解决方法
方法1:手动修改配置文件
- 找到持久化卷对应的本地目录,进入
yb-data/conf/路径 - 编辑
yugabyted.conf,将advertise_address的值改为新容器的IP,或直接设为0.0.0.0(允许绑定所有可用地址) - 重新启动容器
方法2:启动容器时指定参数覆盖配置
启动容器时,通过--advertise_address参数强制指定绑定地址,跳过旧配置的影响:
docker run -d -v /your/local/yb-data:/home/yugabyte/yb-data yugabytedb/yugabyte:latest yugabyted start --advertise_address=0.0.0.0
方法3:给容器分配固定IP
创建自定义Docker网络,给YugabyteDB容器分配固定IP,确保每次重启IP不变:
# 创建自定义子网网络 docker network create --subnet=172.28.0.0/16 yb-net # 启动容器时指定固定IP docker run -d --net yb-net --ip 172.28.0.3 -v /your/local/yb-data:/home/yugabyte/yb-data yugabytedb/yugabyte:latest
内容的提问来源于stack exchange,提问作者FranckPachot

