【发布时间】:2019-08-17 18:19:40
【问题描述】:
我的本地(没有 docker)很好,工作没有任何问题。
本地设置工作正常。
Server-Jar:运行在 8081
Client-War:运行在 8000 并且可以毫无问题地连接到 Server Jar。
码头工人设置 docker-compose.yml
服务器
employee:
image: openjdk:jdk-alpine
container_name: "employee"
ports:
- 9081:8080
- 9991:9990
- 65193:65193
volumes:
- ./Employee/target/Employee-1.0-SNAPSHOT-jar-with-dependencies.jar:/deployments/Employee-1.0-SNAPSHOT-jar-with-dependencies.jar
environment:
- JAVA_OPTS=-agentlib:jdwp=transport=dt_socket,address=0.0.0.0:65193,suspend=n,server=y -Djava.net.preferIPv4Stack=true
- GRPC_PORT=8080
command: java -jar /deployments/Employee-1.0-SNAPSHOT-jar-with-dependencies.jar
client:
image: jboss/wildfly
container_name: "client"
ports:
- 9080:8080
- 9990:9990
- 65193:65193
volumes:
- ./Service/target/Service.war:/opt/jboss/wildfly/standalone/deployments/Service.war
environment:
- JAVA_OPTS=-agentlib:jdwp=transport=dt_socket,address=0.0.0.0:65193,suspend=n,server=y -Djava.net.preferIPv4Stack=true
- EMPLOYEE_HOST=localhost:9081
command: >
bash -c "/opt/jboss/wildfly/bin/add-user.sh admin Admin#007 --silent && /opt/jboss/wildfly/bin/standalone.sh -b 0.0.0.0 -bmanagement 0.0.0.0"
links:
- employee
depends_on:
- employee
员工服务器代码
Server server = ServerBuilder.forPort(Integer.parseInt(env.get("GRPC_PORT")))
.addService(new Employee())
.build();
try {
server.start();
System.out.println("Server listening at: " + env.get("GRPC_PORT"));
server.awaitTermination();
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
客户端连接代码。
ManagedChannel channel = ManagedChannelBuilder.forTarget(env.get("EMPLOYEE_HOST")).usePlaintext().build();
EmployeeServiceGrpc.EmployeeServiceBlockingStub employee = EmployeeServiceGrpc.newBlockingStub(channel);
错误在我进行 gRPC 调用时抛出。
原因:io.grpc.StatusRuntimeException: UNKNOWN at deployment.Service.war//io.grpc.stub.ClientCalls.toStatusRuntimeException(ClientCalls.java:235) 在 deployment.Service.war//io.grpc.stub.ClientCalls.getUnchecked(ClientCalls.java:216) 在 deployment.Service.war//io.grpc.stub.ClientCalls.blockingUnaryCall(ClientCalls.java:141)
您认为 docker 设置正确吗?如果那时我可以在其他地方寻找问题
【问题讨论】:
-
运行 Docker Compose 时,
client服务的localhost是client。因此,您对localhost:9081的client调用指的是client,而不是您希望的server。为了解决这个问题,您可以使用server代替client中的localhost来引用server(主机)。同样,client对0.0.0.0:65193的引用是指其端口65193而不是server主机的端口。有道理。要访问server,您的客户端应使用server而不是localhost或localhost 的别名。 -
你可能对此很熟悉,但
ports用于将容器端口暴露给主机。client配置9080:8080意味着您可以使用localhost:9080访问该容器端口从主机。在 Docker Compose 网络中,容器可以将自己的端口称为localhost:8080,而网络中的其他容器可以将其称为client:8080。推论,ports用于暴露主机上的容器端口(用于通常调试和外部访问),但不需要用于容器间通信。 -
是的,这是有道理的,所以容器如何访问它的主机,我有这个错误
Failed to resolve name. status=Status{code=UNAVAILABLE, description=Unable to resolve host server, -
所以是的,问题是容器如何访问其主机端口?我是 docker-compose 的新手,所以如果你能帮助我的 docker-compose 文件中的代码,我将不胜感激
-
我认为您只需要
client使用employee而不是localhost(而不是0.0.0.0)来引用服务器。而且,因为您随后将显式引用容器,所以您必须使用容器的端口而不是主机的端口。在我的手机上打字很有挑战性,但客户应该,例如` EMPLOYEE_HOST=employee:8080. Theemployee` 容器的8080端口。
标签: java docker docker-compose grpc grpc-java