docker-compose启动Java RMI容器报Connection refused to host: localhost错误
问题根因
- 客户端硬编码连接地址错误:你在Customer的Dockerfile启动命令里写死了
localhost作为RMI服务地址,每个容器的localhost指向自身的网络命名空间,而RMI服务运行在server1容器中,自然无法连通,即使配置了SERVER_HOST环境变量也没有实际使用。 - 缺失RMI服务端必要配置:Java RMI服务默认会把服务端所在机器的本地hostname/IP作为回调地址返回给客户端,如果不主动配置
java.rmi.server.hostname参数,客户端拿到的是server1容器内部的本地地址,后续RMI调用依然会访问错误地址。 - docker-compose配置逻辑错误:你贴出的compose文件中没有定义
server1服务,同时给customer配置network_mode: host和基于容器服务名的寻址逻辑完全冲突。
解决步骤
1. 调整RMI服务端启动配置
修改Server1的Dockerfile,新增RMI必填的系统参数,必须显式指定java.rmi.server.hostname为docker compose中的服务名server1,同时固定RMI用到的所有端口避免随机端口被拦截:
FROM openjdk:8-jre-alpine COPY target/server1-1.0.0-jar-with-dependencies.jar /server1-1.0.0-jar-with-dependencies.jar # 请替换示例端口为你实际业务用到的RMI注册端口、远程对象端口 CMD ["/usr/bin/java", "-cp", "/server1-1.0.0-jar-with-dependencies.jar", "-Djava.rmi.server.hostname=server1", "-Dcom.sun.management.jmxremote.port=1099", "-Dcom.sun.management.jmxremote.ssl=false", "-Dcom.sun.management.jmxremote.authenticate=false", "Server"]
2. 调整客户端启动配置
修改Customer的Dockerfile,删除硬编码的localhost,改为读取环境变量中的SERVER_HOST:
FROM openjdk:8-jre-alpine COPY target/customer-1.0.0-jar-with-dependencies.jar /customer-1.0.0-jar-with-dependencies.jar # 通过sh执行才能读取容器内的环境变量 CMD ["sh", "-c", "/usr/bin/java -cp /customer-1.0.0-jar-with-dependencies.jar Main $SERVER_HOST"]
3. 修正docker-compose配置
补全server1服务定义,删除无效的network_mode: host配置,使用docker默认的桥接网络即可实现服务名互访:
services: server1: # 路径对应server1的Dockerfile存放目录 build: server1 broker: build: broker customer: build: customer environment: SERVER_HOST: server1 depends_on: - server1
4. 额外适配建议
- 确保RMI服务端代码中绑定的注册端口、远程对象暴露端口均为固定值,不要使用随机端口。
depends_on仅能保证容器启动顺序,无法保证RMI服务完全就绪,建议给客户端加连接重试逻辑,或者给server1配置端口健康检查,确认RMI端口可用后再启动customer。
内容的提问来源于stack exchange,提问作者f0body
相关产品推荐
相关产品推荐

