【发布时间】: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