Abel'Blog

我干了什么?究竟拿了时间换了什么?

0%

docker-multiple-connect

  1. 我现在有两个docker,分别用不同的docker compose 来部署的;
  2. 1号docker提供了grpc服务; 2号docker需要去调用1号docker里面的grpc;
  3. 2里提供了http服务器;1号服务器需要回调http;
  4. 我如何来解决这个问题?

以下是解决这个问题的步骤:

一、网络配置

  1. 创建共享网络

    • docker - compose文件中,可以定义一个共享网络,使得两个docker容器能够互相通信。例如,在两个docker - compose.yml文件中添加以下网络配置:
    • 对于1号dockerdocker - compose.yml
      1
      2
      3
      4
      5
      6
      7
      8
      9
      version: '3'
      services:
      service1:
      build:
      context:.
      networks:
      - shared_network
      networks:
      shared_network:
    • 对于2号dockerdocker - compose.yml
      1
      2
      3
      4
      5
      6
      7
      8
      9
      version: '3'
      services:
      service2:
      build:
      context:.
      networks:
      - shared_network
      networks:
      shared_network:
    • 这样,两个容器就处于名为shared_network的同一个网络中,它们可以通过容器名称来互相访问。
  2. 确定容器IP(可选)

    • 如果你想知道容器的IP地址,可以在容器内部使用ifconfig(对于基于Debian或Ubuntu的容器)或ip addr(对于大多数Linux容器)命令来查看。不过,在共享网络环境下,通过容器名称访问更为方便。

二、在2号docker中调用1号docker的grpc服务

  1. 安装grpc客户端库
    • 根据你使用的编程语言,在2号docker中安装对应的grpc客户端库。例如,在Python中,你可以使用grpcio库。如果是Python项目,在2号dockerDockerfile中添加以下安装命令:
      1
      RUN pip install grpcio
  2. 配置grpc客户端连接
    • 2号docker中的代码里,通过容器名称来连接1号docker中的grpc服务。假设1号docker中的grpc服务监听在localhost:50051(这是一个常见的默认端口,实际端口根据你的配置而定),在Python中,代码可能如下:
      1
      2
      3
      4
      5
      import grpc
      from your_proto_file_pb2_grpc import YourServiceStub
      # '1号docker'容器名称是service1,端口是50051
      channel = grpc.insecure_channel('service1:50051')
      stub = YourServiceStub(channel)
    • 这里your_proto_file_pb2_grpcYourServiceStub需要根据你实际的grpc服务定义的proto文件生成的代码来确定具体的名称和调用方式。

三、在1号docker中回调2号docker的http服务

  1. 确定http服务端点
    • 首先,明确2号dockerhttp服务器暴露的端点(例如http://localhost:8080/api/callback),这里的localhost在跨容器调用时要换成2号docker的容器名称(假设为service2),实际的端口也要根据2号dockerhttp服务器的配置来确定。
  2. 在1号docker中发起http请求
    • 根据1号docker中的编程语言,使用合适的http客户端库来发起回调请求。以Python为例,如果使用requests库,代码可能如下:
      1
      2
      3
      import requests
      # 假设2号docker的容器名称是service2,http服务监听在8080端口
      response = requests.get('http://service2:8080/api/callback')

通过以上网络配置和服务调用步骤,就可以实现2号docker调用1号dockergrpc服务,以及1号docker回调2号dockerhttp服务。在实际操作中,还需要注意服务的安全性(如加密grpc通信、认证http请求等)和错误处理等方面的问题。