【问题标题】:Why will my Docker containers not talk to each other为什么我的 Docker 容器不能相互通信
【发布时间】:2019-10-09 16:18:04
【问题描述】:

我正在尝试让我的 node express docker 容器与我的 mysqldb 容器通信。但是当我查询时,我总是得到:'connect ECONNREFUSED 127.0.0.1:3306'。我做错了什么?

这是我的 docker-compose.yml。它启动了我的两个容器。如果我只使用没有容器的 express,my-api 就可以工作。但不是当它在一个。在docker中运行时,express似乎路由正常,但它不会连接到另一个容器中的数据库。

services:
  api:
    image: node:8
    container_name: my-api
    build:
      context: .
      dockerfile: Dockerfile
    command: npm run start
    volumes:
      - .:/usr/app/
      - /usr/app/node_modules
    ports:
      - "3000:3000"
    depends_on:
      - mysqldb
    expose:
      - 3000
    environment:
      PORT: 3000
      REACT_APP_BASE_URL: http://localhost:3000
      DB_HOST: localhost
      DB_NAME: test
      DB_USER: test
      DB_PASS: test
  mysqldb:
    image: mysql:5.7
    container_name: mysqldb
    command: mysqld --user=root --verbose
    volumes:
       - ./schemadump.sql:/docker-entrypoint-initdb.d/schemadump.sql
    ports:
      - "3306:3306"
    expose:
      - 3306
    environment:
      MYSQL_DATABASE: "test"
      MYSQL_USER: "test"
      MYSQL_PASSWORD: "test"
      MYSQL_ROOT_PASSWORD: "root"
      MYSQL_ALLOW_EMPTY_PASSWORD: "yes"

这是我的 docker 文件

FROM node:8

WORKDIR /usr/src/app

COPY ./package.json .

RUN npm install
COPY . .

EXPOSE 3000
CMD [ "npm", "start" ]

这是我的数据库连接文件:

const mysql = require('mysql')

module.exports = function databaseCall (sql) {
  const connection = mysql.createConnection({
    host: process.env.DB_HOST,
    user: process.env.DB_USER,
    password: process.env.DB_PASS,
    database: process.env.DB_NAME
  })
  ...
}

【问题讨论】:

    标签: mysql node.js docker


    【解决方案1】:

    使用mysqldb 代替localhost -

           DB_HOST: mysqldb
    

    容器可以在 docker compose 环境中通过它们的服务名来访问。 localhost 基本上是指您的 API 容器本身。

    【讨论】:

      【解决方案2】:

      Docker 容器充当隔离机器,它们有自己的网络,包括自己的本地主机。 Docker-compose 为您创建了一个内部网络,您应该能够使用服务名称在容器之间进行通信。

      例如,从您的 API 中,您可以通过将主机指定为“mysqldb”来访问您的数据库

      【讨论】:

        【解决方案3】:

        Docker 容器有自己的 DNS 系统。通过容器名称,您可以访问其他容器,但它们应该是一个网络的一部分。

        // docker compose file 
        
        conatiner_name: api-app
        ..
         networks:
          - main-network
        
        // other container
        
        container_name:main-app
        ..
        networks:
          - main-network
        
        
        // In your main app.
        await axios.post('http://api-app:3000/entinty-name',{data: { name: "xyz" } });
        

        【讨论】:

          猜你喜欢
          • 2015-11-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-11-21
          • 2022-01-08
          • 1970-01-01
          • 1970-01-01
          • 2017-01-28
          相关资源
          最近更新 更多