带有NodeJS APP(NestJS)的Docker容器无法从其他容器或主机访问 [英] Docker container with nodejs app(NestJS) is not accessible from both other containers or host
本文介绍了带有NodeJS APP(NestJS)的Docker容器无法从其他容器或主机访问的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有一个应用程序,它由几个停靠容器组成:nginx、客户端、管理员、后端和mongo。
容器";后端&中的正在端口5000上运行NestJS应用程序。集装箱有暴露的端口5000。但是容器没有响应任何请求,容器内的应用程序也没有接收到这些请求。我甚至尝试将端口5000公开给我的本地计算机,这样我就可以在docker-host之外发出请求,但是这种方式容器不会有很好的响应。当我在机器上本地运行这个NestJS应用程序时,一切都运行得很好。我让nginx.conf配置行为nginx容器。它应该使用代理将某些请求重定向到特定容器。此方法适用于客户端和管理容器。托管NextJS应用程序并侦听特定端口。我对后端容器使用了同样的方法,但是即使nginx似乎发出了正确的请求,它也没有收到响应,或者由于某种原因它向docker-host内部的错误地址发出了请求
我的自定义图像的Dockerfile:
FROM node:14.15.4 as client
WORKDIR /usr/src/app
COPY /src/client/package*.json ./
RUN npm install
COPY /src/client .
EXPOSE 3000
CMD ["npm", "run", "dev"]
FROM node:14.15.4 as admin
WORKDIR /usr/src/app
COPY /src/admin/package*.json ./
RUN npm install
COPY /src/admin .
EXPOSE 3001
CMD ["npm", "run", "dev"]
FROM node:14.15.4 as backend
WORKDIR /usr/src/app
COPY /src/app/package*.json ./
RUN npm install
COPY /src/app .
EXPOSE 5000
CMD ["npm", "run", "start:dev"]
docker-compose.yml:
version: '3'
services:
nginx:
image: nginx:${NGNIX_VERSION}
depends_on:
- client
- admin
links:
- client:client
- admin:admin
- backend:backend
restart: on-failure:30
volumes:
- ./deploy/shared/config/nginx/nginx.conf:/etc/nginx/conf.d/default.conf
env_file:
- .env
networks:
- default
expose:
- 80
ports:
- ${NGINX_BIND_PORT}:80
mongo:
image: mongo:${MONGO_VERSION}
env_file:
- .env
networks:
- default
environment:
MONGO_INITDB_ROOT_USERNAME: ${MONGO_USERNAME}
MONGO_INITDB_ROOT_PASSWORD: ${MONGO_PASSWORD}
client:
build:
context: .
target: client
networks:
- default
volumes:
- ./src/client:/usr/src/app
admin:
build:
context: .
target: admin
networks:
- default
volumes:
- ./src/admin:/usr/src/app
backend:
build:
context: .
target: backend
networks:
- default
volumes:
- ./src/app:/usr/src/app
ports:
- 5000:5000
networks:
default:
driver: bridge
nginx.conf:
upstream docker-client {
server client:3000;
}
upstream docker-admin {
server admin:3001;
}
upstream docker-backend {
server backend:5000;
}
server {
listen 80;
server_name mr0bread.local;
location / {
proxy_pass http://docker-client;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_redirect off;
proxy_read_timeout 600s;
}
location /admin {
proxy_pass http://docker-admin;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_redirect off;
proxy_read_timeout 600s;
}
location /backend {
proxy_pass http://docker-backend;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_redirect off;
proxy_read_timeout 600s;
}
}
这里是回购链接:GitHub
推荐答案
为避免答案丢失在评论中:Docker网络和链接的设置看起来是正确的,因此这似乎是进程本身的问题。
在启动nest.js进程时,绑定到与localhost
或127.0.0.1
不同的接口非常重要,因为Docker创建虚拟网络接口并使用这些接口与进程通信。因此,即使localhost
在主机上直接运行也可以,但不适用于Docker网络。此端口只能从容器内部访问。
所以,而不是
app.listen("localhost:3000");
像这样绑定所有接口(当然要使用相应的端口号):
app.listen("0.0.0.0:3000");
这篇关于带有NodeJS APP(NestJS)的Docker容器无法从其他容器或主机访问的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文