【问题标题】:Getting error "cURL error 7: Failed to connect to localhost port" when calling API from another container从另一个容器调用 API 时出现错误“cURL 错误 7:无法连接到 localhost 端口”
【发布时间】:2022-01-24 22:16:09
【问题描述】:

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

  1. 前端(角度)[http://localhost:4200]
  2. 后端(PHP)[http://localhost:80]
  3. 后端数据库(Mysql)
  4. 集成服务(NodeJS)[http://localhost:4433]
  5. 集成服务数据库(MongoDB)
  6. 身份验证层(NodeJS)[http://localhost:4454]
  7. 身份验证层数据库(Mysql)

到目前为止,我已经成功地将所有这些服务容器化,但是当我的“Backend(PHP)”容器尝试从“Integration Service(NodeJS)”调用 API 时,它会抛出 cURL error 7: Failed to connect to localhost port 4433: Connection refused (see http://curl.haxx.se/libcurl/c/libcurl-errors.html) 的错误。

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=
    volumes:
      - ./dump:/docker-entrypoint-initdb.d
    container_name: wms-backend-mysql-app
  phpmyadmin:
    image: phpmyadmin/phpmyadmin:4.7
    depends_on:
      - mysql
    networks:
      - backend
    ports:
      - "40002:80"
    environment:
      - PMA_HOST=wms-backend-mysql-app
      - PMA_PORT= 3306
    volumes:
      - /sessions
    container_name: wms-backend-phpmyadmin-app
  app:
    container_name: wms_auth
    restart: always
    build: ../../wms_auth/.
    networks:
      - backend
    volumes:
      - ../../auth/./:/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
      - MYSQL_USER= root
      - MYSQL_PASSWORD=
    volumes:
      - ../../auth/dump/:/docker-entrypoint-initdb.d
    networks:
      - backend
    healthcheck:
      test: ["CMD", "mysql", "-h", "db","-u","root", "mysql", "-e", "select 1"]
      interval: 1s
      retries: 20
  wms_integration:
    container_name: integration
    restart: always
    build: ../../wmsIntegeration/.
    volumes:
      - ../../wmsIntegeration/./:/usr/src/app
      - /usr/src/app/node_modules
    ports:
      - "4433:4433"
    networks:
      - backend
    links:
      - db
    depends_on:
      db:
        condition: service_healthy
  wms_integration_db:
    image: mongo
    restart: always
    networks:
      - backend
    ports:
      - "27019:27017"
    volumes:
      - ../../wmsIntegeration/mongodb:/data/db
    healthcheck:
      test: echo 'db.runCommand("ping").ok' | mongo db:27017/config --quiet
      interval: 10s
      timeout: 10s
      retries: 5
networks:
  local:
    driver: bridge
    
networks:
  frontend:
  backend:

【问题讨论】:

  • 您可能希望添加一个指向集成服务的链接,以便您可以在容器之间内部访问它。
  • 我怎样才能做到这一点?
  • 为什么不使用容器名称或任何自选别名访问另一个容器?另外,当 PHP 代码(你忘了分享)抛出这样的错误时,这真的是 Node 的问题吗?
  • localhost 在 Docker 中通常表示“这个容器”;你不能用它来连接容器。正如@NicoHaase 建议的那样,您可以使用 Compose 服务名称作为主机名;有关更多详细信息,请参阅 Docker 文档中的 Networking in Compose。 (各种links:networks: 设置只是令人困惑,我建议将它们全部删除。)
  • 我也尝试将容器名称用作本地主机,但随后显示“无法解析主机:CONTAINER_NAME”

标签: php node.js docker


【解决方案1】:

按如下方式桥接所有网络:

networks:
  local:
    driver: bridge
  frontend: 
    driver: bridge
  backend:
    driver: bridge

【讨论】:

  • 请在您的答案中添加一些解释,以便其他人可以从中学习
  • bridge 驱动程序通常是默认的,除非您要部署到 Docker 的 Swarm 集群系统,在这种情况下您可能实际上需要默认的 overlay。我认为这无助于解决问题中的问题。
猜你喜欢
  • 2017-11-09
  • 2018-08-01
  • 1970-01-01
  • 2019-02-19
  • 2021-05-23
  • 2023-03-26
  • 2019-05-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多