无法在同一网络中按名称访问Docker容器 [英] Can't access Docker container by name in same network

查看:130
本文介绍了无法在同一网络中按名称访问Docker容器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

您能指出我在这里想念的东西吗?

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容器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆