【发布时间】:2021-11-19 12:31:00
【问题描述】:
我正在尝试运行多个通过 java RMI 相互连接的 docker 容器。这可以在 docker 容器之外(使用 sudo)工作,但是在通过 docker-compose 运行它时我得到了一个 java.rmi.ConnectException: Connection refused to host: localhost 异常。
我尝试了network_mode 的多种变体,并在客户端的 java 命令中将localhost 作为参数传递,但均未成功
服务器 1 的 Dockerfile
FROM openjdk:8-jre-alpine
COPY target/server1-1.0.0-jar-with-dependencies.jar /server1-1.0.0-jar-with-dependencies.jar
CMD ["/usr/bin/java", "-cp", "/server1-1.0.0-jar-with-dependencies.jar", "Server"]
客户的Dockerfile
FROM openjdk:8-jre-alpine
COPY target/customer-1.0.0-jar-with-dependencies.jar /customer-1.0.0-jar-with-dependencies.jar
CMD ["/usr/bin/java", "-cp", "/customer-1.0.0-jar-with-dependencies.jar", "Main","localhost"]
Docker 编写文件
services:
broker:
build: broker
customer:
build: customer
environment:
SERVER_HOST: server1
depends_on:
- server1
network_mode: host
错误:
Successfully tagged project_customer:latest
Starting project_server1_1 ... done
Recreating quoco-rmi_client_1 ... done
Attaching to project_server1_1, project_customer_1
server1_1 | waiting for connection
customer_1 | Exception in thread "main" java.rmi.ConnectException: Connection refused to host: localhost; nested exception is:
customer_1 | java.net.ConnectException: Connection refused (Connection refused)
customer_1 | at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:619)
customer_1 | at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:216)
customer_1 | at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:202)
customer_1 | at sun.rmi.server.UnicastRef.newCall(UnicastRef.java:338)
customer_1 | at sun.rmi.registry.RegistryImpl_Stub.lookup(RegistryImpl_Stub.java:112)
customer_1 | at Main.main(Main.java:24)
customer_1 | Caused by: java.net.ConnectException: Connection refused (Connection refused)
customer_1 | at java.net.PlainSocketImpl.socketConnect(Native Method)
customer_1 | at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
customer_1 | at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
customer_1 | at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
customer_1 | at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
customer_1 | at java.net.Socket.connect(Socket.java:589)
customer_1 | at java.net.Socket.connect(Socket.java:538)
customer_1 | at java.net.Socket.<init>(Socket.java:434)
customer_1 | at java.net.Socket.<init>(Socket.java:211)
customer_1 | at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:40)
customer_1 | at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:148)
customer_1 | at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:613)
customer_1 | ... 5 more
project_customer_1 exited with code 1
【问题讨论】:
-
localhost在 Docker 中通常表示“这个容器”,而不是其他容器之一。 Docker 文档中的Networking in Compose 描述了在容器之间建立连接的机制。不要使用network_mode: host:这是不必要的,通常会禁用 Docker 的所有网络功能。 -
注册表未在本地主机中运行。