两个Docker容器无法通信

时间:2020-06-20 17:27:07

标签: docker docker-compose dockerfile microservices

我有两个Docker容器。一个容器是数据库,另一个是Web应用程序。 Web应用程序通过此链接http:// localhost:7200调用数据库。但是,Web应用程序Docker容器无法访问数据库容器。

我尝试了这个docker-compose.yml,但不起作用:

version: '3'
services:
  web:
    # will build ./docker/web/Dockerfile
    build: 
       context: .
       dockerfile: ./docker/web/Dockerfile
    links:
      - graph-db
    depends_on:
     - graph-db
    ports:
     - "8080:8080"
    environment:
      - WAIT_HOSTS=graph-db:7200
    networks: 
      - backend

  graph-db:
    # will build ./docker/graph-db/Dockerfile
    build:
        ./docker/graph-db
    hostname: graph-db
    ports:
      - "7200:7200"

networks:
  backend:
    driver: "bridge"

所以我有两个容器: Web应用程序:http:// localhost:8080 / reasoner,此容器将调用位于另一个容器中的http:// localhost:7200中的数据库。 但是,Web容器无法访问数据库容器。

解决方案

version: '3'
services:
  web:
    # will build ./docker/web/Dockerfile
    build: 
       context: .
       dockerfile: ./docker/web/Dockerfile
    depends_on:
     - graph-db
    ports:
     - "8080:8080"
    environment:
      - WAIT_HOSTS=graph-db:7200


  graph-db:
    # will build ./docker/graph-db/Dockerfile
    build:
        ./docker/graph-db
    ports:
      - "7200:7200"

,并将Web应用程序代码中的http:// localhost:7200替换为http:// graph-db:7200

2 个答案:

答案 0 :(得分:3)

请勿使用localhost在容器之间进行通信。网络是docker中的命名空间之一,因此容器内部的localhost仅连接到该容器,而不连接到外部主机,也没有连接到另一个容器。在这种情况下,请在您的应用中使用服务名称graph-db而不是localhost连接数据库。

答案 1 :(得分:1)

您的数据库主机为graph-db,您应在应用程序的数据库配置中使用该名称。例如:http://graph-db:7200

来自docker网络文档(网桥网络-Docker中的默认网络驱动程序):

想象一个具有Web前端和数据库后端的应用程序。 如果您将容器称为 web db ,则网络容器可以连接 到 db 的db容器,无论哪个Docker托管应用程序 堆栈正在运行。