Как мне подключить 2 серверных приложения Java websocket в Docker?

#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.