用Java实现两个容器之间的Docker通信
有两个java文件,Server.java和Client.java。 两者都在不同的容器中 DOCKER文件: 我用于服务器的dockerfile(在名为“服务器”的文件夹中)是:用Java实现两个容器之间的Docker通信,docker,Docker,有两个java文件,Server.java和Client.java。 两者都在不同的容器中 DOCKER文件: 我用于服务器的dockerfile(在名为“服务器”的文件夹中)是: FROM java:8 COPY Server.java / RUN javac Server.java EXPOSE 25000 ENTRYPOINT ["java"] CMD ["Server"] 客户端的dockerfile(位于名为“客户端”的文件夹中)为: FROM java:8 COPY Client.
FROM java:8
COPY Server.java /
RUN javac Server.java
EXPOSE 25000
ENTRYPOINT ["java"]
CMD ["Server"]
客户端的dockerfile(位于名为“客户端”的文件夹中)为:
FROM java:8
COPY Client.java /
RUN javac Client.java
EXPOSE 25000
ENTRYPOINT ["java"]
CMD ["Client"]
构建容器:
使用sudo docker build-t serverimage构建容器。
运行容器:
我使用命令sudocker run
运行映像,首先运行serverimage
我(运行clientimage时)得到的错误是:
java.net.ConnectException: Connection refused: connect
import java.io.*;
import java.net.*;
public class MyServer {
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);}
}
}
import java.io.*;
import java.net.*;
public class MyClient {
public static void main(String[] args) {
try{
Socket s=new Socket("localhost",25000);
DataOutputStream dout=new DataOutputStream(s.getOutputStream());
dout.writeUTF("Hello Server");
dout.flush();
dout.close();
s.close();
}catch(Exception e){System.out.println(e);}
}
}
Server.java文件:
java.net.ConnectException: Connection refused: connect
import java.io.*;
import java.net.*;
public class MyServer {
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);}
}
}
import java.io.*;
import java.net.*;
public class MyClient {
public static void main(String[] args) {
try{
Socket s=new Socket("localhost",25000);
DataOutputStream dout=new DataOutputStream(s.getOutputStream());
dout.writeUTF("Hello Server");
dout.flush();
dout.close();
s.close();
}catch(Exception e){System.out.println(e);}
}
}
Client.java文件:
java.net.ConnectException: Connection refused: connect
import java.io.*;
import java.net.*;
public class MyServer {
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);}
}
}
import java.io.*;
import java.net.*;
public class MyClient {
public static void main(String[] args) {
try{
Socket s=new Socket("localhost",25000);
DataOutputStream dout=new DataOutputStream(s.getOutputStream());
dout.writeUTF("Hello Server");
dout.flush();
dout.close();
s.close();
}catch(Exception e){System.out.println(e);}
}
}
我可能做错了什么?
谢谢大家! 有三个问题:
此外,客户端docker文件中不需要EXPOSE指令。对于现代docker版本(1.13+) 要理解这种方法哪里出了问题,有所有复杂的细节,但它很大程度上归结为一个事实,即您不能简单地在一个容器中引用
localhost
,并期望它路由到主机上运行的另一个容器
默认情况下,每个容器网络和每个容器都有效地显示为同一子网中该网桥网络上的独立主机。容器可以通过其在网桥网络上分配的IP地址引用其他容器,但是localhost
只是引用容器本身,而不是运行容器的底层主机
为了实现与您所追求的类似的可预测路由,您可以在用户定义的网络上创建和运行客户机和服务器容器。这确实需要在Client.java
中进行一个小的代码更改。您必须使用选定的别名(例如server
)来寻址服务器,而不是localhost
。编辑客户端代码并重建clientimage
后,请尝试以下操作:
- 创建网络-
sudo docker网络创建客户端\服务器\网络
- 运行服务器-
sudocker运行--network alias server--network client\u server\u network-it serverimage
- 运行客户端-
sudo docker Run--network client\u server\u network-it clientimage
- 您应该在服务器终端中看到
打印message=Hello Server
docker run
提供了一个额外的--网络别名服务器
,以添加一个网络别名,客户端可以预期地到达服务器容器。有多种方法可以实现这种别名,包括使用--name
选项,但请查看以了解更多详细信息
对于较旧的docker版本(1.12-)
Docker通过Docker run
提供的--link
选项提供了一个。您将需要一些与上面相同的更新,特别是使用类似于server
的东西来代替localhost
,并使用--name server
运行服务器容器。docker运行将如下所示:
- 运行服务器-
sudo docker Run--name server-it serverimage
- 运行客户端-
sudo docker Run--link server-it clientimage
- 您应该在服务器终端中看到
打印message=Hello Server