【问题标题】:gRPC communication between docker containersdocker 容器之间的 gRPC 通信
【发布时间】: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 服务的localhostclient。因此,您对localhost:9081client 调用指的是client,而不是您希望的server。为了解决这个问题,您可以使用server 代替client 中的localhost 来引用server(主机)。同样,client0.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. The employee` 容器的8080 端口。

标签: java docker docker-compose grpc grpc-java


【解决方案1】:

看这个人为的例子:

version: "3"

services:

  server:
    image: nginx:1.17.3
    restart: always
    container_name: nginx
    expose:
    - "80"
    ports:
    - 8888:80

  client:
    image: busybox:1.31.0
    restart: always
    depends_on:
    - server
    container_name: busybox
    command:
    - ash
    - -c
    - |
      while true;
      do
        wget --spider http://server:80 2>&1
        sleep 5s;
      done;

client 通过端口80 访问Nginx 容器,但它使用server 作为主机地址来解析到适当的(Nginx)容器。

如果您要在client 中将server 替换为localhost,客户端将尝试对自己执行wget 命令,这将失败。

因为server8888 发布到主机,当Docker Compose 启动时,从主机(!),您可以wget http://localhost:8888,这将工作(200)。

【讨论】:

  • 嘿,我回来了,是 :80 解决了这个困惑。所以我的理解是 docker-compose 在这个例子中通过给定的名称、客户端和服务器创建了一个机器/实例网络,所以问题是你可以创建多个网络吗?
  • 我还需要这个 -> links: 属性吗?
  • 在这种情况下不需要使用links,因为services 名称(serverclient)就足够了。见docs.docker.com/compose/compose-file/#links
猜你喜欢
  • 1970-01-01
  • 2017-10-17
  • 1970-01-01
  • 2018-04-30
  • 2021-05-03
  • 1970-01-01
  • 2015-04-18
  • 2020-04-12
  • 1970-01-01
相关资源
最近更新 更多