Я установил очень простое сокетное соединение, используя следующие классы Java:
Server.java
:
public class Server
{
public static void main(String[] args) throws Exception
{
try (ServerSocket listener = new ServerSocket(59090))
{
while (true)
{
try (Socket socket = listener.accept())
{
Scanner in = new Scanner(socket.getInputStream());
while (in.hasNextLine())
{
System.out.println("UPPER CASE: " + in.nextLine().toUpperCase());
}
}
}
}
}
}
Client.java
:
public class Client
{
public static void main(String[] args) throws Exception
{
try (Socket socket = new Socket("172.17.0.2", 59090))
{
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
while (true)
{
Thread.sleep(1000);
out.println("hello world");
}
}
}
}
Я хочу запустить их как отдельные контейнеры Docker, поэтому я создал соответствующие Dockerfile
s и docker-compose.yml
:
Dockerfile
(Сервер):
FROM openjdk:13-ea-16-jdk-alpine3.9
RUN mkdir -p /app/server
WORKDIR /app/server
COPY ./Server.java ./
RUN javac Server.java
ENTRYPOINT ["java", "Server"]
Dockerfile
(Клиент):
FROM openjdk:13-ea-16-jdk-alpine3.9
RUN mkdir -p /app/client
WORKDIR /app/client
COPY ./Client.java ./
RUN javac Client.java
ENTRYPOINT ["java", "Client"]
docker-compose.yml
:
version: "3.7"
services:
client:
image: utku/socket-client:0.1.0
build: ./client
server:
image: utku/socket-server:0.1.0
build: ./server
После построения изображений с использованием docker-compose build
и запуска сначала server
, а затем client
с использованием docker run ...
, я увидел, что IP-адрес сервера становится 172.17.0.2
, а IP-адрес клиента - 172.17.0.3
. Вот почему я указываю IP-адрес в соответствующей строке в Client.java
:
// Client.java
try (Socket socket = new Socket("172.17.0.2", 59090))
Документация Docker гласит, что я должен иметь доступ к server
из client
, используя его имя службы в качестве fofllows, которое server
внутри docker-compose.yml
.
// Client.java
try (Socket socket = new Socket("server", 59090))
Однако, когда я пытаюсь заменить этот IP-адрес именем службы сервера, я получаю следующую ошибку:
Exception in thread "main" java.net.UnknownHostException: server
at java.base/java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:224)
at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:350)
at java.base/java.net.Socket.connect(Socket.java:620)
at java.base/java.net.Socket.connect(Socket.java:568)
at java.base/java.net.Socket.<init>(Socket.java:459)
at java.base/java.net.Socket.<init>(Socket.java:236)
at Client.main(Client.java:12)
Не могли бы вы указать мне, что мне здесь не хватает?