我有两个java文件server.java和client.java。两者都在不同的容器中。
docker文件:我用于服务器的dockerfile(在名为“server”的文件夹中)是:
FROM java:8
COPY Server.java /
RUN javac Server.java
EXPOSE 25000
ENTRYPOINT ["java"]
CMD ["Server"]
客户端的dockerfile(在名为“client”的文件夹中)是:
FROM java:8
COPY Client.java /
RUN javac Client.java
EXPOSE 25000
ENTRYPOINT ["java"]
CMD ["Client"]
来建造我用的围城
docker build . (for the client Dockerfile)
docker build . (for the server Dockerfile)
对于我使用的网络设置
docker network create client_server_network
docker run --network-alias server --network client_server_network -it serverimage
docker run --network client_server_network -it clientimage
我运行客户端映像时遇到的错误是
java.net.ConnectException: Connection refused (Connection refused)
客户端.java
import java.io.*;
import java.net.*;
public class Client {
public static void main(String[] args) {
try {
Socket s = new Socket("192.168.2.5", 25000);
DataOutputStream dout = new DataOutputStream(s.getOutputStream());
dout.writeUTF("Hello Server");
dout.flush();
dout.close();
s.close();
} catch (Exception e) {
System.out.println(e);
}
}
}
服务器.java
import java.io.*;
import java.net.*;
public class Server {
public static void main(String[] args) {
try {
ServerSocket ss = new ServerSocket(25000);
Socket s = ss.accept();// establishes connection
DataInputStream dis = new DataInputStream(s.getInputStream());
String str = (String) dis.readUTF();
System.out.println("message= " + str);
ss.close();
} catch (Exception e) {
System.out.println(e);
}
}
}
我做错了什么?
1条答案
按热度按时间vcirk6k61#
默认情况下,docker在容器之间使用自动dns解析。容器可以通过名称或别名相互解析(docker桥网络)
在客户端,您显式定义了服务器的ip地址:
Socket serverSocker = new Socket("192.168.2.5", 25000);
.docker不知道,而不是使用容器的名称或别名:
Socket serverSocker = new Socket("server", 25000);
或者可以通过环境变量动态传递服务器的主机:Socket serverSocket = new Socket(System.getenv("SERVER_HOST_ENV"), 25000);
不要忘记传递环境变量:docker run --env SERVER_HOST_ENV=server --network-alias server --network client_server_network -it server