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 вопроса:
Могу ли я именем сервиса заменить IP адрес сервера, как я сделал в строке
String ip = "app_server";
Так как на ютубе видел, что это якобы возможно. Если не могу, то как понять с каким IP создастся контейнер сервера?
- Не могу найти ошибку, почему не создаются контейнеры??
Подскажите пожалуйста. Приветствуются ЛЮБЫЕ идеи и советы. Заранее всем благодарен за помощь!!
