簡體   English   中英

無法在同一網絡中按名稱訪問Docker容器

[英]Can't access Docker container by name in same network

我使用以下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

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容器運行,所以我創建了相應的Dockerfiledocker-compose.yml

Dockerfile (服務器):

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 (客戶端):

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

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相應行中指定IP地址的原因:

// Client.java
try (Socket socket = new Socket("172.17.0.2", 59090))

Docker文檔聲明我應該能夠使用其服務名稱fofllows從client訪問server ,fofllows是docker-compose.yml server

// Client.java
try (Socket socket = new Socket("server", 59090)) 

但是,當我嘗試用服務器的服務名稱替換此IP地址時,我收到以下錯誤:

Exception in thread "main" java.net.UnknownHostException: server
    at java.base/java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:224)
    at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:350)
    at java.base/java.net.Socket.connect(Socket.java:620)
    at java.base/java.net.Socket.connect(Socket.java:568)
    at java.base/java.net.Socket.<init>(Socket.java:459)
    at java.base/java.net.Socket.<init>(Socket.java:236)
    at Client.main(Client.java:12)

你能指出我在這里失蹤的東西嗎?

您需要端口暴露給網絡。 您的docker-compose文件應如下所示:

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"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM