用Java实现两个容器之间的Docker通信

用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.

有两个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.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);}  
   }  
}  
我可能做错了什么? 谢谢大家!

有三个问题:

  • 类应命名为ServerClient,否则Server.java和Client.java文件应分别命名为MyServer.java和MyClient.java
  • 创建Docker容器时,将创建两个接口:localhost和另一个用于与其他容器通信的接口。您应该将“localhost”更改为服务器容器IP或主机IP
  • java图像已被弃用

  • 此外,客户端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
      打印

    错误之处在于从客户端连接到客户端(这就是“localhost”的意思——容器本身)。你可能想读一点,成功了!非常感谢。