해당 오류는 gateway ←→ microservice 간 통신을 하기 위해 docker로 감싸서 실행 했을 때 나타난 오류이다. 이 문제가 발생한 이유는 docker 를 컨테이너로 감싸서 실행을 할 때 컨테이너들끼리 통신이 되지 않기에 host 오류라고 할 수 있다.
docker-compose.yaml에 networks - backend - bridge를 제작해 연결해주어야 한다.
networks:
backend:
driver: bridge
Nestjs Microservice 실행 시 options - host 에다가 “0.0.0.0”을 설정해 주어야 한다.
const microserviceTCP = app.connectMicroservice<MicroserviceOptions>({
transport: Transport.TCP,
options: {
host: '0.0.0.0',
port: 3003,
},
});
Gateway에서 로컬인지 production인지 확인하여 “host.docker.internal”로 설정하여 microservice를 연결해주어야 한다.
const environment = process.env.NODE_ENV || 'production';
const MICRO_SERVICES = {
AUTH: {
NAME: 'AUTH_SERVICE',
HOST: environment === 'development' ? 'localhost' : 'host.docker.internal',
PORT: 3001,
},
CORE: {
NAME: 'CORE_SERVICE',
HOST: environment === 'development' ? 'localhost' : 'host.docker.internal',
PORT: 3002,
},
TICKET: {
NAME: 'TICKET_SERVICE',
HOST: environment === 'development' ? 'localhost' : 'host.docker.internal',
PORT: 3003,
},
};
// gateway에서 연결할 때
ClientsModule.register([
{
name: MICRO_SERVICES.CORE.NAME,
transport: Transport.TCP,
options: {
host: MICRO_SERVICES.CORE.HOST,
port: MICRO_SERVICES.CORE.PORT,
},
},
]),
로컬 호스트에서는 잘 실행이 된다.
해당 오류는 ubuntu 환경에서 host.docker.internal을 인식하지 못하는 것으로 인해 발생을 한다. 이는 window, mac 전용으로 linux나 ubuntu 환경에서는 바로 사용할 수는 없다.
docker-compose.yaml에서 서비스들마다 extra_hosts를 설정하여 해결해주어야 한다.
services:
gateway:
image: jinsungguri/fanup-gateway:latest
ports:
- '3000:3000'
networks:
- backend
extra_hosts:
- 'host.docker.internal:host-gateway'
auth:
image: jinsungguri/fanup-auth:latest
ports:
- '3001:3001'
- '4001:4001'
networks:
- backend
extra_hosts:
- 'host.docker.internal:host-gateway'
배포 환경에서도 매우 잘 실행이되고 gateway와 microservice들끼리도 잘 통신이 된다