我使用以下Java类建立了非常简单的套接字通信:
I've set up a very simple socket communication using the following Java classes:
Server.java :
Server.java:
public class Server { public static void main(String[] args) throws Exception { try (ServerSocket listener = new ServerSocket(59090)) { while (true) { try (Socket socket = listener.accept()) { Scanner in = new Scanner(socket.getInputStream()); while (in.hasNextLine()) { System.out.println("UPPER CASE: " + in.nextLine().toUpperCase()); } } } } } }Client.java :
Client.java:
public class Client { public static void main(String[] args) throws Exception { try (Socket socket = new Socket("172.17.0.2", 59090)) { PrintWriter out = new PrintWriter(socket.getOutputStream(), true); while (true) { Thread.sleep(1000); out.println("hello world"); } } } }我想将它们作为单独的Docker容器运行,因此我创建了相应的 Dockerfile s和 docker-compose.yml :
I want to run them as separate Docker containers, so I've created corresponding Dockerfiles and docker-compose.yml:
Dockerfile (服务器):
Dockerfile (Server):
FROM openjdk:13-ea-16-jdk-alpine3.9 RUN mkdir -p /app/server WORKDIR /app/server COPY ./Server.java ./ RUN javac Server.java ENTRYPOINT ["java", "Server"]Dockerfile (客户端):
Dockerfile (Client):
FROM openjdk:13-ea-16-jdk-alpine3.9 RUN mkdir -p /app/client WORKDIR /app/client COPY ./Client.java ./ RUN javac Client.java ENTRYPOINT ["java", "Client"]docker-compose.yml :
docker-compose.yml:
version: "3.7" services: client: image: utku/socket-client:0.1.0 build: ./client server: image: utku/socket-server:0.1.0 build: ./server使用 docker-compose build 构建映像并首先运行 server ,然后使用 docker run运行 client 后...,我看到Server的IP变为 172.17.0.2 ,而Client的IP变为 172.17.0.3 .这就是为什么我在 Client.java :
After building the images using docker-compose build and running firstly the server then the client using docker run ..., I saw that Server's IP becomes 172.17.0.2 and Client's IP becomes 172.17.0.3. That's why I specify the IP address in the corresponding line in Client.java:
// Client.java try (Socket socket = new Socket("172.17.0.2", 59090))Docker文档指出,我应该能够使用其服务名称作为以下内容从 client 访问 server ,即 server > docker-compose.yml .
Docker documentation states that I should be able to access server from client using its service name as fofllows, which is server inside docker-compose.yml.
// Client.java try (Socket socket = new Socket("server", 59090))但是,当我尝试用服务器的服务名称替换此IP地址时,出现以下错误:
However, when I try to replace this IP address with the service name of server, I get the following error:
Exception in thread "main" java.UnknownHostException: server at java.base/java.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:224) at java.base/java.SocksSocketImpl.connect(SocksSocketImpl.java:350) at java.base/java.Socket.connect(Socket.java:620) at java.base/java.Socket.connect(Socket.java:568) at java.base/java.Socket.<init>(Socket.java:459) at java.base/java.Socket.<init>(Socket.java:236) at Client.main(Client.java:12)您能指出我在这里想念的东西吗?
Could you point me out what I'm missing here?
推荐答案您需要将端口暴露给网络.您的 docker-compose 文件应如下所示:
You need to expose the ports to the network. Your docker-compose file should look like this:
version: "3.7" services: client: image: utku/socket-client:0.1.0 build: ./client expose: - "59090" server: image: utku/socket-server:0.1.0 build: ./server expose: - "59090"更多推荐
无法在同一网络中按名称访问Docker容器
发布评论