无法在同一网络中按名称访问Docker容器 [英] Can't access Docker container by name in same network
问题描述
我使用以下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 Dockerfile
s 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运行
,我看到Server的IP变为 client
后... 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屋!