繁体   English   中英

为什么我的Docker容器不互相通信

[英]Why will my Docker containers not talk to each other

我试图让我的节点快速泊坞窗容器与我的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"

这是我的码头工人文件

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
  })
  ...
}

使用mysqldb代替localhost

       DB_HOST: mysqldb

容器可在docker compose环境中通过其服务名称进行访问。 localhost基本上是指您的API容器本身。

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

例如,通过API,您可以通过将host指定为“ mysqldb”来访问数据库

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" } });

暂无
暂无

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

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