Как подключить 2 приложения сервера веб-сокетов Java в Docker?

У меня есть 2 приложения Java Spring Boot, которые я подключаю через локальный порт 81. Код в порядке, поскольку он работает в Eclipse. Когда я использую докер, я пытаюсь открыть порты, и это не удается. Я не могу заставить образы докеров соединяться друг с другом в двух отдельных терминалах докеров.

Код сервера:

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 для обоих из них и запускаю два образа на разных терминалах Docker.

  • Терминал 1 (приложение My Server): docker run --expose=81 contactcentre2
  • Терминал 2 (мое клиентское приложение): docker run --expose=81 contactcentretest

Как подключить 2 приложения сервера веб-сокетов Java в Docker?

Я попытался открыть порт 81, но мое клиентское приложение по-прежнему не может подключиться к другому серверу.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
726
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Внутри вашего контейнера ваше приложение не знает, что такое «localhost».

Если вы используете свой сетевой IP, он будет работать. Лучше используйте сеть докеров или композицию:

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: вам не нужно открывать порт от вашего клиента.

Решение, которое я нашел, было на самом деле очень простым после прочтения предоставленной вами ссылки: docs.docker.com/v17.09/engine/userguide/networking/…. Запустите приложение в Docker Toolbox: '$ docker run --network=host [imageName]' для обоих образов Docker, чтобы соединить их на локальном хосте.

Qwisatz 10.04.2019 22:51

Другие вопросы по теме