繁体   English   中英

当一个 docker 容器从另一个容器调用 API 时出现错误“ECONNREFUSED 127.0.0.1:80”

[英]Getting error "ECONNREFUSED 127.0.0.1:80" when one docker container call API from another container

我正在对一个具有多种不同服务的应用程序进行 docker 化,并且我使用 Docker Compose 文件来为所有服务实现此单个 docker-compose.yml 文件,为每个服务实现一个 Dockerfile。

  1. 前端(角度)[http://localhost:4200]
  2. 后端(PHP)[http://localhost:80]
  3. 后端数据库(Mysql)
  4. 身份验证层(NodeJS)[http://localhost:4454]
  5. 认证层数据库(Mysql)

到目前为止,我已经成功地将所有这些服务容器化,但是当应用程序尝试登录“Auth Layer(NodeJS)”在“Backend(PHP)”API 上发送请求以进行一些数据处理时,我得到了一个问题"ECONNREFUSED 127.0.0.1:80" error but if I try the same API on Postman it works but not from "Auth Layer(NodeJS)" I have also tried to call some third party API and it also works fine in AuthLayer so what should成为问题,因为我是 Docker 的新手,我无法在几天内找到解决方案。

这是我的 docker.compose.yml 文件

services:
  angular-service:
    container_name: wms_frontend
    build: ../frontend/.
    ports:
      - "4200:80"
  php:
    build: 
      context: .
    image: wms-backend
    networks:
      - frontend
      - backend
    environment:
      - MYSQL_HOST=wms-backend-mysql-app
      - MYSQL_USER=wmsroot
      - MYSQL_PASSWORD=pass
      - MYSQL_DB=dbname
    volumes:
      - ./:/var/www/html/wms/backend
    ports:
      - "80:80"
    container_name: wms-backend-php-app
  mysql:
    image: mysql:5.7
    networks:
      - backend
    environment:
      - MYSQL_ROOT_PASSWORD=rootpassword
      - MYSQL_USER=wmsroot
      - MYSQL_PASSWORD=pass
      - MYSQL_DATABASE=dbname2
    container_name: wms-backend-mysql-app
  phpmyadmin:
    image: phpmyadmin/phpmyadmin:4.7
    depends_on:
      - mysql
    networks:
      - backend
    ports:
      - "40002:40002"
    environment:
      - PMA_HOST=wms-backend-mysql-app
      - PMA_PORT= 3306
    volumes:
      - /sessions
    container_name: wms-backend-phpmyadmin-app
  app:
    container_name: auth_layer
    restart: always
    build: ../../auth_layer/.
    networks:
      - backend
    volumes:
      - ../../auth_layer/./:/usr/src/app
      - /usr/src/app/node_modules
    ports:
      - "4454:4454"
    links:
      - db
    depends_on:
      db:
        condition: service_healthy
  db:
    image: mariadb
    restart: always
    ports:
      - "3308:3306"
    environment:
      - MYSQL_ALLOW_EMPTY_PASSWORD= YES
      - MYSQL_DATABASE=auth_layer
      - MYSQL_USER= root
      - MYSQL_PASSWORD=
    volumes:
      - ../../auth_layer/dump/:/docker-entrypoint-initdb.d
    networks:
      - backend
    healthcheck:
      test: ["CMD", "mysql", "-h", "db","-u","root", "mysql", "-e", "select 1"]
      interval: 1s
      retries: 20
networks:
  local:
    driver: bridge
    
networks:
  frontend:
  backend:

当您的应用程序在 docker 容器中运行时, localhost不再指向您的开发笔记本电脑(或服务器),而是指向容器本身。

由于每个应用程序都在单独的容器中运行,当前面访问到后面时,您不能使用localhost 由于localhost指向前面的容器,而后面没有部署在那里。

在指定连接 url 时,您应该使用容器名称而不是localhost

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM