Docker+Java. Не работает Сервер - Клиенты

Всем привет! Разбираюсь сейчас с докером и столкнулся со следующей проблемой: Во время практики с Docker Compose не удалось создать контейнеры. Суть задачи: Существует Сервер (на языке Java). Оно просто запускается и ждет, когда на него кто-то что-то пришлет. Сервер самый примитивный, без пулов потоков и всяких наворотов модных, так как сейчас для задачи это не особо важно. Код Сервера:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

class Server {
    public static void main(String[] args) throws IOException {
        System.out.println("Server was started!");
        try (ServerSocket serverSocket = new ServerSocket(8899)) {
            while (true) {
                try (Socket client = serverSocket.accept()) {
                    BufferedReader reader = new BufferedReader(new InputStreamReader(client.getInputStream()));
                    String line = reader.readLine();
                    System.out.println(client.getInetAddress().getHostAddress() + " - " + line);
                } catch (Exception e) {
                    System.out.println("Dops");
                }
            }
        }
    }
}

Существуют 2 клиента. Также на языке Java. Также максимально простые:

import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.net.Socket;


class Client {
    public static void main(String[] args) throws IOException, InterruptedException {
           
        
        String ip = "app_server";
        while (true){
        try (Socket socket = new Socket(ip, 8899)) {
            System.out.println("An attempt...");
            Thread.sleep(10000);
            BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
            String message = "Hello from client_1\n";
            writer.write(message);
            writer.flush();
            System.out.println("The package was sent!");
        }
        }
        
    }
}

Второй клиент абсолютно такой же, только отправляет сообщение "Hello from client_1\n".

Идея такая: создать 3 контейнера (Сервер, клиент№1, клиент№2). И чтобы клиенты раз в 10 сек отправляли сообщение на сервер. Испытал у себя на компе. Все работает прекрасно. Сообщения доходят. (Правда ip я задавал жестко в коде клиентов). Создал структуру папок:

введите сюда описание изображения

Содержимое докер файлов ниже: клиент1:

FROM openjdk:11

WORKDIR /app_client1

COPY . .

RUN javac Client.java

CMD [ "java", "Client" ]

клиент2

FROM openjdk:11

WORKDIR /app_client2

COPY . .

RUN javac Client.java

CMD [ "java", "Client" ]

Сервер:

FROM openjdk:11

WORKDIR /app_server

COPY . .

RUN javac Server.java

CMD [ "java", "Server" ]

и docker-compose:

version: '3'

services:
  app_server:
    build: ./app_server
  app_client1:
    build: ./app_client1  
  app_client2:
    build: ./app_client2 

Отправляю команду docker-compose up и получаю вот такой вывод:

PS D:\it\dockerNet\docker-compose-app> docker-compose up
[+] Running 3/3
 - Container docker-compose-app-app_server-1   Cr...                                             0.6s
 - Container docker-compose-app-app_client2-1  C...                                              0.6s
 - Container docker-compose-app-app_client1-1  C...                                              0.6s
Attaching to docker-compose-app-app_client1-1, docker-compose-app-app_client2-1, docker-compose-app-app_server-1
docker-compose-app-app_client1-1  | Exception in thread "main" java.net.ConnectException: Connection refused (Connection refused)
docker-compose-app-app_client1-1  |     at java.base/java.net.PlainSocketImpl.socketConnect(Native Method)
docker-compose-app-app_client1-1  |     at java.base/java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:412)
docker-compose-app-app_client1-1  |     at java.base/java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:255)
docker-compose-app-app_client1-1  |     at java.base/java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:237)
docker-compose-app-app_client1-1  |     at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
docker-compose-app-app_client1-1  |     at java.base/java.net.Socket.connect(Socket.java:609)
docker-compose-app-app_client1-1  |     at java.base/java.net.Socket.connect(Socket.java:558)
docker-compose-app-app_client1-1  |     at java.base/java.net.Socket.<init>(Socket.java:454)
docker-compose-app-app_client1-1  |     at java.base/java.net.Socket.<init>(Socket.java:231)
docker-compose-app-app_client1-1  |     at Client.main(Client.java:15)
docker-compose-app-app_server-1   | /bin/sh: 1: [java,: not found
docker-compose-app-app_client1-1 exited with code 1
docker-compose-app-app_server-1 exited with code 127
docker-compose-app-app_client2-1  | Exception in thread "main" java.net.NoRouteToHostException: No route to host (Host unreachable)
docker-compose-app-app_client2-1  |     at java.base/java.net.PlainSocketImpl.socketConnect(Native Method)
docker-compose-app-app_client2-1  |     at java.base/java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:412)
docker-compose-app-app_client2-1  |     at java.base/java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:255)
docker-compose-app-app_client2-1  |     at java.base/java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:237)
docker-compose-app-app_client2-1  |     at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
docker-compose-app-app_client2-1  |     at java.base/java.net.Socket.connect(Socket.java:609)
docker-compose-app-app_client2-1  |     at java.base/java.net.Socket.connect(Socket.java:558)
docker-compose-app-app_client2-1  |     at java.base/java.net.Socket.<init>(Socket.java:454)
docker-compose-app-app_client2-1  |     at java.base/java.net.Socket.<init>(Socket.java:231)
docker-compose-app-app_client2-1  |     at Client.main(Client.java:15)
docker-compose-app-app_client2-1 exited with code 1

Теперь мучают 2 вопроса:

  1. Могу ли я именем сервиса заменить IP адрес сервера, как я сделал в строке

    String ip = "app_server";

Так как на ютубе видел, что это якобы возможно. Если не могу, то как понять с каким IP создастся контейнер сервера?

  1. Не могу найти ошибку, почему не создаются контейнеры??

Подскажите пожалуйста. Приветствуются ЛЮБЫЕ идеи и советы. Заранее всем благодарен за помощь!!


Ответы (0 шт):