Почему мои контейнеры Docker не будут общаться друг с другом? - PullRequest
0 голосов
/ 23 мая 2019

Я пытаюсь заставить мой контейнер экспресс-док узла взаимодействовать с моим контейнером mysqldb.Но когда я запрашиваю, я всегда получаю: «connect ECONNREFUSED 127.0.0.1:3306».Что я делаю не так?

Вот мой docker-compose.yml.Это раскручивает мои два контейнера.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
  })
  ...
}

Ответы [ 2 ]

1 голос
/ 23 мая 2019

Контейнеры Docker действуют как изолированные машины, и у них есть своя сеть, включая собственный localhost.Docker-compose создает для вас внутреннюю сеть, и вы должны иметь возможность обмениваться данными между вашими контейнерами, используя имя службы.

Например, из вашего API вы можете обратиться к своей базе данных, указав host как «mysqldb»

1 голос
/ 23 мая 2019

Используйте mysqldb вместо localhost -

       DB_HOST: mysqldb

Контейнеры доступны по имени службы в среде docker compose. localhost в основном означает сам API-контейнер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...