【问题标题】:Can't access Docker container by name in same network无法在同一网络中按名称访问 Docker 容器
【发布时间】:2019-05-04 18:27:37
【问题描述】:

我使用以下 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 容器运行,因此我创建了相应的 Dockerfiles 和 docker-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 后,我看到服务器的IP 变为172.17.0.2,客户端的IP 变为172.17.0.3。所以我在Client.java的对应行中指定了IP地址:

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

Docker 文档指出,我应该能够从 client 访问 server,使用其服务名称作为 fofllows,即 serverdocker-compose.yml

// 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 network inspect bridge 它会显示容器 IP 掩码 172.17.0.0/16。这意味着不知何故,它不使用 docker-compose 的(默认)网桥。请检查您的网络配置。如果网络有问题,请告诉我。

标签: java docker websocket docker-compose


【解决方案1】:

您需要expose 到网络的端口。您的 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"

【讨论】:

  • 我可以使用 IP "172.17.0.2" 连接到服务器而不会暴露端口。我不需要公开端口只是为了使用服务名称而不是 IP。
  • 这很奇怪。你确定你没有混淆ips?因为您需要公开端口才能在另一个服务中通过名称或 ip 访问它们。所以对我来说唯一有意义的解释是你偶然连接到本地主机。
  • 请检查容器的别名。也许他们的名字不仅仅是客户端和服务器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-09
  • 1970-01-01
  • 2017-11-08
  • 2021-12-23
  • 1970-01-01
  • 1970-01-01
  • 2020-06-06
相关资源
最近更新 更多