Docker容器内Node.js应用跨服务API请求失败问题求助
容器内Node.js应用跨服务请求失败问题排查与解决
问题描述
我正在开发基于Docker容器运行的应用,包含两个Node.js应用:
node-sdc-service:容器内运行于5000端口,同时主机5000端口映射到容器5000端口yolov5-service:主机8888端口映射到容器内5000端口
尝试从node-sdc-service向主机8888端口对应的yolov5-serviceAPI路由发送HTTP请求时失败,但通过浏览器、未容器化的Node.js应用访问该API端点均正常。
附docker-compose.yml配置:
version: "3.8" services: node-sdc-service: build: context: . dockerfile: Dockerfile-dev environment: CHOKIDAR_USEPOLLING: 'true' container_name: node-sdc tty: true ports: - "0.0.0.0:3000:3000" - "0.0.0.0:4000:4000" - "0.0.0.0:5000:5000" - "0.0.0.0:8000:80" volumes: - .:/usr/src/app yolov5-service: build: context: . dockerfile: Dockerfile-yolo environment: CHOKIDAR_USEPOLLING: 'true' container_name: yolo tty: true ports: - "0.0.0.0:8888:5000" volumes: - .:/usr/src/app/server - ./training_data:/usr/src/coco - ./yolo_runs:/usr/src/app/runs mongo-sdc-service: image: mongo:5.0-focal container_name: mongo-sdc environment: MONGO_INITDB_ROOT_USERNAME: root MONGO_INITDB_ROOT_PASSWORD: 1004 MONGO_INITDB_DATABASE: sdc volumes: - mongo-sdc-storage:/data/db ports: - 27020:27017 volumes: mongo-sdc-storage:
问题根源
容器内的localhost指向自身容器的网络环境,而非宿主机。直接使用localhost:8888发起请求,容器会尝试访问自身的8888端口,而非宿主机映射的yolov5-service服务。
解决方法
方法1:使用Docker Compose服务名访问(推荐)
Docker Compose会自动为同一配置文件中的服务创建内部网络,服务间可通过服务名直接通信,无需依赖主机端口映射。
修改node-sdc-service中的请求地址为:
http://yolov5-service:5000/你的API路径
这里的yolov5-service是docker-compose.yml中定义的服务名,容器内部可直接解析到该服务的网络地址,使用容器内部的5000端口即可。
方法2:使用宿主机实际IP访问
若必须使用主机端口,可在容器内使用宿主机的实际IP地址(如192.168.x.x:8888)代替localhost:8888。注意:不要使用127.0.0.1,它在容器内指向自身。
方法3:确认网络一致性
默认情况下,docker-compose会创建默认网络并将所有服务加入其中。若自定义了网络,需确保两个服务配置在同一网络下。
验证步骤
修改请求地址后,重启容器测试:
docker-compose down && docker-compose up --build
内容的提问来源于stack exchange,提问作者shafnaz
相关产品推荐
相关产品推荐

