【问题标题】:Connecting service to Docker container through TCP通过 TCP 将服务连接到 Docker 容器
【发布时间】:2021-04-20 09:05:01
【问题描述】:

我在 Docker 容器中使用带有 NestJS 的 API 网关(目前)和一个微服务(也带有 NestJS)。计划是让网关与我配置的任何可包含微服务进行通信,但我很难建立这种连接。

  • 如果我在没有容器的情况下部署两个项目(网关和微服务),它们会成功通信;
  • 如果网关在容器内,它将找不到服务,因为它在“localhost”而不是容器主机上寻找它(我稍后会研究这个,尽管我不确定如何解决它);
  • 如果网关部署在本地并且微服务在容器内,我似乎无法与它通信,它总是给我一个超时。

最后一点是我要在这里解决的问题。经过大量实验后,我似乎根本无法完成这项工作,而且这看起来是一件非常微不足道的事情。这是我的代码:

网关模块配置:

@Module({
  imports: [
    ClientsModule.register([
      {
        name: 'trips-svc',
        transport: Transport.TCP,
        options: {
          host: '127.0.0.1',
          port: 3002,
        },
      },
    ]),
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

网关 docker-compose

version: "3.7"

services:
  gateway:
    build:
      context: .
      target: development
    networks:
      - web-gate-net
    volumes:
      - .:/usr/src/web-gate
      - /usr/src/web-gate/node_modules
    expose:
      - 5001
    ports:
      - 5001:5001
    command: npm run start:dev
    restart: "on-failure"

networks:
  web-gate-net:

(与此项目关联的 Dockerfile 只是构建应用程序并运行 node dist/main

微服务 docker-compose

version: "3.7"

services:

  service:
    build:
      context: .
      target: development
      network: host
    volumes:
      - .:/usr/src/trips-svc
      - /usr/src/trips-svc/node_modules
    expose:
      - ${SERVICE_PORT}
    ports:
      - ${SERVICE_PORT}:${SERVICE_PORT}
    command: npm run start:dev
    restart: "on-failure"

(SERVICE_PORT 在 .env 文件上设置为 3002)

我已经对这些配置进行了一些实验(使用 expose 关键字、ports 关键字,两者都...),但这是配置原样。我对网络比较陌生,所以我不确定这里出了什么问题,但我很确定这与我的网络配置有关,而且由于这是一个相当具体的问题,我似乎找不到任何文档这有帮助。

如果有人能给我任何指点,我将不胜感激。

谢谢。

【问题讨论】:

  • 你不应该把两者放在同一个网络吗?
  • 只有当我将网关和微服务都设置为network_mode: host 时,我才能做到这一点。如果我尝试单独指定网络,即使它们位于公共网络中,上述情况也适用。如果我指定network_mode,我不能指定networks,并且我不希望所有服务都可以相互访问(如果可能的话)。
  • From inside of a Docker container, how do I connect to the localhost of the machine? 是否解决了您的问题,正如您所指出的,在 Docker 中,localhost 通常是容器本身,但该问题描述了如何回调主机。如果两个组件在同一个 Compose 文件中,Docker 文档中的 Networking in Compose 会描述可用的主机名。

标签: docker networking docker-compose microservices nestjs


【解决方案1】:

如果您希望网关和服务都在不同的容器中运行:

您的网关的 docker-compose ports 行应如下所示:3002:5001。这会将您的 3002 端口公开为 5002 用于容器外的任何内容。您应该删除 exposenetworks(在您的服务中和文件末尾)行以及其中嵌套的内容。

至于您的微服务的 docker-compose 也删除 networkexpose 行。

在您的网关中,当从您的容器调用时,您应该将 localhost 替换为 service。在您的服务容器内部也一样,将localhost 替换为gateway。这是因为 docker 有自己的网络,并且名称只是您在 docker-compose 文件中services 之后设置的名称。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-19
    • 2019-03-07
    • 2022-07-21
    相关资源
    最近更新 更多