#java #spring #docker #websocket
#java #spring #docker #websocket
Вопрос:
У меня есть 2 загрузочных приложения Java Spring, которые я подключаю через порт локального хоста 81. Код в порядке, поскольку он работает в Eclipse. Когда я использую docker, я пытаюсь открыть порты, и это не удается. Я не могу заставить изображения docker соединяться друг с другом в 2 отдельных терминалах docker.
Серверный код:
public static void main(String[] args) {
SpringApplication.run(SpringGetApplication.class, args);
try {
final int portNumber = 81;
ServerSocket serverSocket = new ServerSocket(portNumber);
while (true) {
// SOCKET MESSAGE SENDER
// SOCKET SENDS MESSAGE THEN CLOSES
Socket socket = serverSocket.accept();
OutputStream os = socket.getOutputStream();
PrintWriter pw = new PrintWriter(os, true);
// PW, PRINTWRITER SENDS STRINGS TO OTHER SERVER
pw.println("Hello");
// BUFFEREDREADER READS OTHER SERVER'S MESSAGES
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
// WHILE LOOP TO KEEP READING LINE WHEN THE INPUTS ARE COMING
String answer = null;
while ((answer = br.readLine()) != null) {
System.out.println(answer);
}
pw.println("I HAVE SUCCESSFULLY RECIEVED YOUR DATA");
pw.close();
br.close();
}
} catch (Exception e) { }
}
Клиентский код:
public static void main(String[] args) {
SpringApplication.run(SpringGetApplication.class, args);
try {
final String host = "localhost";
final int portNumber = 81;
System.out.println("Creating server socket on port " portNumber);
Socket socket = new Socket(host, portNumber);
// READS RESPONSE FROM THE SERVER
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
// PRINTWRITER USES SOCKET OUTPUT TO SEND THE DATA OUT TO THE OTHER SERVER
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
System.out.println("server says:" br.readLine());
String outputTextToCC = "HOWDY THERE, i'M THE CLIENT";
// OUT SENDS THE STRING TO THE OTHER SERVER
out.println(outputTextToCC);
out.println("FINISH");
// READS RESPONSE FROM OTHER SERVER
System.out.println("server says:" br.readLine());
br.close();
socket.close();
} catch (Exception e) { }
}
Я создал образы Docker для них обоих и запустил 2 образа на отдельных терминалах Docker.
- Терминал 1 (мое серверное приложение):
docker run --expose=81 contactcentre2
- Терминал 2 (мое клиентское приложение):
docker run --expose=81 contactcentretest
Я попытался открыть порт 81, но мое клиентское приложение по-прежнему не может подключиться к другому серверу.
Ответ №1:
Внутри вашего контейнера ваше приложение не знает, что такое «localhost».
Если вы используете свой сетевой IP, он будет работать. Лучше используйте docker networking или compose :
https://docs.docker.com/v17.09/engine/userguide/networking/#the-default-bridge-network
https://docs.docker.com/compose/
Вы найдете пример здесь: https://docs.docker.com/compose/overview /
И закончить чем-то вроде этого :
version: '3'
services:
server:
image: server-img
ports:
- "81:81"
client:
image: client-img
links:
- server
Затем замените «localhost» на «server».
PS: вам не нужно предоставлять порт от вашего клиента.
Комментарии:
1. Решение, которое я нашел, на самом деле было очень простым, прочитав ссылку: docs.docker.com/v17.09/engine/userguide/networking/… вы предоставили. Запустите приложение в Docker Toolbox с помощью: ‘$ docker run —network=host [imageName]’ для обоих образов docker, чтобы подключить их к localhost.