我现在正在学习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
1条答案
按热度按时间shyt4zoc1#
服务器-MYSERVER.java
客户端-MYCLIENT.java
生成Java以执行JAR
主机测试
java -jar MYSERVER-1.0-SNAPSHOT.jar
java -jar MYCLIENT-1.0-SNAPSHOT.jar localhost 1
java -jar MYCLIENT-1.0-SNAPSHOT.jar localhost 2
java -jar MYCLIENT-1.0-SNAPSHOT.jar localhost 3
我的服务器客户端
MYSERVER -停靠文件
MYSERVER -生成命令
MYCLIENT -停靠文件
MYCLIENT -生成命令
测试
测试服务器-演示服务器
docker run -it demoserver
docker ps
docker inspect demoserver-container-id
获取容器IP,如
"IPAddress": "172.17.0.2"
测试客户端-客户端
docker run -it democlient 172.17.0.2 1
docker run -it democlient 172.17.0.2 2
docker run -it democlient 172.17.0.2 3
docker run -it democlient 172.17.0.2 4
个见航站楼1
查找
最后一步创建
docker-compose.yml
停靠-撰写.yml
运行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
自行将
image
更改为build
。一次只做一件事
docker-compose.yml
我习惯把问题切割成很多部分,然后解决每一部分,测试每一部分,最后把每一部分组合起来但每一部分都经过测试,所以我可以知道如果出现错误消息是什么,哪一部分是错误的,以及如何处理。