Docker中Rpcbind启动报错:无法运行多个Rpcbind服务
问题描述
在CentOS 7宿主机上运行两个基于ubuntu/20.04镜像的容器A和B时,容器A的rpcbind服务可正常启动,但启动容器B的rpcbind服务时出现如下报错:
# service rpcbind restart * Stopping RPC port mapper daemon rpcbind [ OK ] * Starting RPC port mapper daemon rpcbind rpcbind: another rpcbind is already running. Aborting
停止容器A的rpcbind服务后,容器B的rpcbind服务可正常启动。宿主机的rpcbind服务运行正常,Docker环境中默认仅允许运行一个rpcbind服务。
需求是通过以下脚本将容器A、B配置为NIS客户端:
service rpcbind start service nis start
由于无法同时运行多个rpcbind服务,导致无法同时启动两个容器的NIS客户端,修改Docker网络后问题仍未解决,需实现多容器同时正常启动NIS客户端的方案。
解决方案
方案1:为每个容器配置独立rpcbind监听端口
每个容器使用默认桥接网络(独立网络命名空间),通过修改rpcbind配置实现端口隔离:
- 进入容器,编辑
/etc/default/rpcbind文件,添加自定义端口参数:- 容器A配置:
OPTS="-p 111"(默认端口) - 容器B配置:
OPTS="-p 1111"
- 容器A配置:
- 重启rpcbind服务:
service rpcbind restart - 修改NIS客户端配置,指定对应rpcbind端口:编辑
/etc/yp.conf,在NIS服务器条目后追加port <端口号>,例如:domain nisdomain server nisserver port 1111 - 重启nis服务:
service nis start
方案2:禁用宿主机rpcbind服务(谨慎操作)
若宿主机无需rpcbind服务,可停止并禁用它,让容器内rpcbind使用默认端口且互不冲突:
systemctl stop rpcbind systemctl disable rpcbind
注意:此操作会影响宿主机依赖rpcbind的服务,需确认无业务影响后执行。
方案3:使用自定义容器镜像封装NIS客户端
放弃容器内系统自带服务,构建自定义NIS客户端镜像,通过环境变量指定rpcbind端口:
- 编写Dockerfile,将rpcbind启动命令改为带端口参数的形式,例如:
CMD ["rpcbind", "-p", "${RPC_PORT:-111}"] - 启动容器时通过
-e RPC_PORT=xxx传递不同端口,容器A用-e RPC_PORT=111,容器B用-e RPC_PORT=1111 - 同步在镜像中配置NIS客户端指向对应rpcbind端口,确保服务正常关联
方案4:使用host网络模式(不推荐生产环境)
启动容器时添加--net=host参数,让容器共享宿主机网络命名空间,但需调整rpcbind端口避免冲突:
- 容器内启动rpcbind时指定非默认端口:
rpcbind -p 1111 - 修改NIS客户端配置对应端口,此方式会降低容器隔离性,仅适合测试场景
内容的提问来源于stack exchange,提问作者Wind
相关产品推荐
相关产品推荐

