He estado tratando de hacer que una aplicación Java RMI funcione en docker como prueba desde hace algún tiempo.
La aplicación funciona cuando ambos componentes están en la misma PC, cuando el "servidor" está en docker no.
¿Cómo puedo ejecutar un método remoto que he dockerizado?
Hay un fragmento de mi cliente:
Registry registry = LocateRegistry.getRegistry(DOCKER_EXPOSED_PORT); // this prints any found registry names String[] s = registry.list(); System.out.println(s[0]); CommonInterface stub = (CommonInterface) registry.lookup("RegisteredStub"); int response = stub.CommonMethod();Y mi "servidor":
CommonInterface stub = (CommonInterface) UnicastRemoteObject.exportObject(obj, 2000); LocateRegistry.createRegistry(2000); Registry registry = LocateRegistry.getRegistry(2000); registry.bind("RegisteredStub", stub); También uso System.out.println(Inet4Address.getLocalHost().getHostAddress()); para obtener la dirección IP de ambos componentes, son iguales cuando se ejecutan localmente pero diferentes cuando el servidor está en la ventana acoplable como se esperaba.
Mi cliente puede "leer" el código auxiliar registrado del contenedor acoplable, por lo que si le cambio el nombre a RegisteredStub2 , entonces
String[] s = registry.list(); System.out.println(s[0]); imprime RegisteredStub2 para que, de alguna manera, mi cliente pueda ver el registro en Docker pero no pueda acceder al método remoto.
El cliente falla con: java.net.ConnectException: Conexión agotada: connect java.rmi.ConnectException: Conexión rechazada para hospedar: DOCKER IP;
cuando llamo al método remoto int response = stub.CommonMethod(); desde el cliente de escritorio.
Aquí están mis comandos de archivos acoplables:
EXPOSE 2000 CMD ["./rmiregistry 2000"] CMD ["./rmid -J-Djava.security.policy=rmid.policy -port 2000"]¡Gracias!
Puede que sea demasiado tarde para ser útil, pero recientemente construí un proyecto experto de varios módulos para una tarea universitaria y lo dockericé.
Tu docker-compose.yml debería verse así:
version: '3' services: server: build: server client: build: client environment: SERVER_HOST: server depends_on: - server Sus servidores Dockerfile algo como esto:
FROM openjdk:8-jre-alpine COPY target/server-jar-with-dependencies.jar /server.jar CMD /usr/bin/java -jar /server.jar Y sus clientes Dockerfile algo como esto:
FROM openjdk:8-jre-alpine ENV SERVER_HOST=localhost COPY target/client-jar-with-dependencies.jar /client.jar CMD /usr/bin/java -jar /client.jar $SERVER_HOSTTenga en cuenta la variable $SERVER_HOST pasada al cliente, esto le permitirá hacer lo siguiente en el código del cliente:
Registry registry = LocateRegistry.getRegistry(args[0]);