为什么Docker(Java服务器-客户端)不工作?

0mkxixxg  于 2022-12-11  发布在  Docker
关注(0)|答案(1)|浏览(148)

我现在正在学习Docker,我遇到了一个问题:我一直在练习Docker编写,并得到了一个创建容器的问题。任务:有一个服务器(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");
                }
            }
        }
    }
}

有两个客户端。同样是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!");
        }
        }
        
    }
}

第二个客户端完全相同,但消息为“来自client_2\n的Hello”。
因此,我们的想法是创建3个容器(服务器,客户端#1,客户端#2)。客户端必须每10秒向服务器发送一条消息。我在我的电脑上试过,一切都很好。它工作得很完美。但我192.168.7.121在客户端应用程序代码中使用了明确的IP www.example.com。
所以我创建了文件夹:

来自客户端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" ]

来自服务器的Docker文件

FROM openjdk:11

WORKDIR /app_server

COPY . .

RUN javac Server.java

CMD [ "java", "Server" ]

对接合成:

version: '3'

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

当我在终端输入“docker-compose up”命令后,a得到了这个:

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

而现在有两个问题:
1.我可以改变服务器的IP地址的服务名称“app_server”。关于youtube教程,这可能是可能的。如果我不能使用,我怎么suposse知道IP地址的服务器之前,容器创建?
1.我不明白为什么我不能创建容器。哪里是错误的,什么是错误的?我做错了什么?
我将非常感激你的帮助!
更新:
根据下面注解中的建议,我修改了两个客户端中的代码以避免可能的异常。现在它们看起来像:

import java.io.IOException;

class Client {
    public static void main(String[] args) throws IOException, InterruptedException {
        System.out.println("TEST");
        
    }
}

但我还是有错误:

PS D:\it\dockerNet\docker-compose-app> docker-compose up
[+] Running 3/0
 - Container docker-compose-app-app_client2-1  C...                                              0.0s 
 - Container docker-compose-app-app_server-1   Cr...                                             0.0s 
 - Container docker-compose-app-app_client1-1  C...                                              0.0s 
Attaching to docker-compose-app-app_client1-1, docker-compose-app-app_client2-1, docker-compose-app-app_server-1
docker-compose-app-app_server-1   | /bin/sh: 1: [java,: not found
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_client1-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_client1-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_client1-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_client1-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_client1-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_client1-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_client1-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_client1-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_client1-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_client1-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_client1-1  |     at Client.main(Client.java:15)
docker-compose-app-app_client1-1 exited with code 1
docker-compose-app-app_client2-1 exited with code 1
shyt4zoc

shyt4zoc1#

服务器-MYSERVER.java

package org.example;

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

public class MYSERVER {
    public static void main(String[] args) {
        System.out.println("Hello world!");
        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");
                }
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

客户端-MYCLIENT.java

package org.example;

import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Calendar;

public class MYCLIENT {
    public static void main(String[] args)  {
        System.out.println("Hello world!");
        String ip = "localhost";
        if (args.length > 0) ip= args[0];
        System.out.println("ip="+MYCLIENT.javaip);
        int no = 1;
        if (args.length > 1) no= Integer.parseInt(args[1]);
        String whoami="client #"+no;
        System.out.println("whoami="+whoami);
        while (true){
            try (Socket socket = new Socket(ip, 8899)) {
                System.out.println("An attempt...");
                BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
                String message = "Hello from "+whoami+" at "+ Calendar.getInstance().getTime() +"\n";
                writer.write(message);
                writer.flush();
                System.out.println("The package was sent!");
            } catch (UnknownHostException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                Thread.sleep(10000);
            }catch (InterruptedException e) {
                 //do nothing
            }
        }
    }
}

生成Java以执行JAR

  • MYCLIENT-1.0-SNAPSHOT.jar
  • MYSERVER-1.0-SNAPSHOT.jar

主机测试

  • 打开端子1:java -jar MYSERVER-1.0-SNAPSHOT.jar
  • 打开端子2:java -jar MYCLIENT-1.0-SNAPSHOT.jar localhost 1
  • 打开端子3:java -jar MYCLIENT-1.0-SNAPSHOT.jar localhost 2
  • 打开端子4:java -jar MYCLIENT-1.0-SNAPSHOT.jar localhost 3

我的服务器客户端

├── docker-compose.yml
├── MYCLIENT
│   ├── Dockerfile
│   └── MYCLIENT-1.0-SNAPSHOT.jar
└── MYSERVER
    ├── Dockerfile
    └── MYSERVER-1.0-SNAPSHOT.jar

MYSERVER -停靠文件

FROM eclipse-temurin:17.0.5_8-jre-ubi9-minimal
EXPOSE 8899
WORKDIR /app
COPY MYSERVER-1.0-SNAPSHOT.jar /app/app.jar
ENTRYPOINT ["java","-jar", "app.jar"]

MYSERVER -生成命令

docker build -t demoserver:1.0.0 .
       
docker tag demoserver:1.0.0 demoserver:latest

MYCLIENT -停靠文件

FROM eclipse-temurin:17.0.5_8-jre-ubi9-minimal
WORKDIR /app
COPY MYCLIENT-1.0-SNAPSHOT.jar /app/app.jar
ENTRYPOINT ["java","-jar", "app.jar"]
CMD ["locahost","1"]

MYCLIENT -生成命令

docker build -t democlient:1.0.0 .
       
docker tag democlient:1.0.0 democlient:latest

测试

测试服务器-演示服务器

  • 打开端子1:docker run -it demoserver
  • 打开端子2:docker ps
  • 端子2:docker inspect demoserver-container-id

获取容器IP,如"IPAddress": "172.17.0.2"

测试客户端-客户端

  • 打开端子3:docker run -it democlient 172.17.0.2 1
  • 打开端子4:docker run -it democlient 172.17.0.2 2
  • 打开端子5:docker run -it democlient 172.17.0.2 3
  • 打开端子6:docker run -it democlient 172.17.0.2 4

见航站楼1

查找

$ docker run -it demoserver
Hello world!
Server was started!
172.17.0.3 - Hello from client #1 at Sun Dec 11 10:07:47 GMT 2022
172.17.0.3 - Hello from client #1 at Sun Dec 11 10:07:57 GMT 2022
172.17.0.4 - Hello from client #2 at Sun Dec 11 10:08:02 GMT 2022
172.17.0.3 - Hello from client #1 at Sun Dec 11 10:08:07 GMT 2022
172.17.0.4 - Hello from client #2 at Sun Dec 11 10:08:12 GMT 2022
172.17.0.3 - Hello from client #1 at Sun Dec 11 10:08:17 GMT 2022
172.17.0.5 - Hello from client #3 at Sun Dec 11 10:08:17 GMT 2022
172.17.0.4 - Hello from client #2 at Sun Dec 11 10:08:22 GMT 2022

最后一步创建docker-compose.yml

停靠-撰写.yml

version: '3.4'

services:
  demoserver:
    image: demoserver

  democlient1:
    image: democlient
    command: demoserver 1
    depends_on:
      - demoserver

  democlient2:
    image: democlient
    command: demoserver 2
    depends_on:
      - demoserver

  democlient3:
    image: democlient
    command: demoserver 3
    depends_on:
      - demoserver

运行Docker合成

  • 开放终端:docker compose up

我的服务器客户端演示服务器-1创建的容器0. 0 s我的服务器客户端演示客户端3 -1创建的容器0. 0 s我的服务器客户端演示客户端1 -1创建的容器0. 0 s我的服务器客户端演示客户端2 -1创建的容器0. 0 s连接到我的服务器客户端演示客户端1 -1,我的服务器客户端演示客户端2 -1,我的服务器客户端演示客户端3 -1,我的服务器客户端演示服务器-1我的服务器客户端演示服务器-1|世界,您好!|服务器已启动!my_server_client-democlient 2 -1|世界,您好!|ip=演示服务器我的服务器客户端-演示客户端2 -1| whoami=客户端#2我的服务器客户端-演示客户端2 -1|尝试...我的服务器客户端演示客户端3 -1|世界,您好!|ip=演示服务器我的服务器客户端-演示客户端1 -1|世界,您好!|whoami=客户端#3我的服务器客户端-演示客户端2 -1|软件包已发送!my_server_client-democlient 1 -1| ip=演示服务器我的服务器客户端演示服务器-1| 172.18.0.3-来自客户端#2的问候,时间为2022年12月1 - 1日星期日10:29:55 GMT,我的服务器客户端演示客户端1 -1| whoami=客户端#1我的服务器客户端-演示客户端3 -1|尝试...我的服务器客户端演示客户端1 -1|尝试...我的服务器客户端演示客户端3 -1|软件包已发送!my_server_client-demoserver-1| 172.18.0.4-您好,来自客户端#3,时间为2022年12月1 - 1日星期日10:29:55 GMT,我的服务器客户端演示客户端1 -1|软件包已发送!my_server_client-demoserver-1| 172.18.0.5-来自客户#1的问候,2022年12月11日星期日10:29:55 GMT

再次执行Docker撰写

  • 开放终端:docker compose up --scale app_client1=10

DIY

services:
  demoserver:
    image: demoserver

  democlient1:
    image: democlient
  ...

自行将image更改为build
一次只做一件事

  • 步骤1.测试java部分、服务器、客户端
  • 步骤2.将服务器、客户端打包为execute jar
  • 步骤3.在主机上测试,而不是在Docker上
  • 步骤4.将服务器打包为Docker映像
  • 步骤5.测试服务器使用Docker映像,但在主机上测试客户端
  • 步骤6.将客户端打包为Docker映像
  • 步骤7.测试服务器映像和客户端映像
  • 步骤8.构建docker-compose.yml
  • 步骤9.测试Docker compose

我习惯把问题切割成很多部分,然后解决每一部分,测试每一部分,最后把每一部分组合起来但每一部分都经过测试,所以我可以知道如果出现错误消息是什么,哪一部分是错误的,以及如何处理。

相关问题