Подключение контейнера NodeJS Docker к контейнеру MySQL Docker - docker-compose 3 - PullRequest
0 голосов
/ 11 ноября 2018

Когда я пытаюсь подключить два контейнера докера на той же машине , один из которых работает на сервере node.js , а другой - mysql dbms

Я получаю следующую ошибку:

(node:32) UnhandledPromiseRejectionWarning: Error: getaddrinfo ENOTFOUND jdbc:mysql://localhost:3306 jdbc:mysql://localhost:3306:3306

конфигурация подключения драйвера mysql

const connection= mysql.createConnection({
  host: 'jdbc:mysql://topsectiondb:3306',
  user: 'root',
  password: 'rootpass' 
})

докер-compose.yml

version: '3'
services:
  topsection:
    container_name: topsection-server
    restart: always
    build: .
    ports:
      - '7777:7777'
    depends_on: 
      - topsectiondb
    environment:
      - PORT=7777
  topsectiondb:
    container_name: topsectiondb
    image: mysql:8.0.3
    ports:
      - '3306:3306'
    environment:
      - MYSQL_ROOT_PASSWORD=rootpass

Dockerfile

FROM node:10

RUN mkdir serviceFolder

WORKDIR /usr/app/

COPY . . 

RUN npm install

EXPOSE 7777

CMD ["npm", "start"]

для более полной трассировки стека https://gist.github.com/armouti/877a8b4405330c44e4009ebae3df822c

1 Ответ

0 голосов
/ 11 ноября 2018

Прежде всего, здесь есть пара проблем.

Во-первых, вам нужно взглянуть на объединение ваших контейнеров Docker в файле docker-compose вместе. По сути, каждый контейнер не знает другого, пока вы не укажете, в какой сети он находится. Каждый контейнер может быть в нескольких, но если вы хотите, чтобы два контейнера подключались, они должны быть в одной сети. https://docs.docker.com/compose/networking/#configure-the-default-network

Тогда, во-вторых, вы не можете использовать localhost в качестве URL. По сути, Docker-контейнер является изолированной средой, поэтому у него есть собственный "localhost", поэтому при использовании этого адреса он фактически пытается подключиться к mysql в контейнере nodejs. Таким образом, при правильном подключении к сети вы сможете подключиться к контейнеру mysql, используя их имена, которые вы дали им в docker-compose, что-то вроде topsectiondb:3306 или что-то вроде этого. Это говорит Docker о том, что вы используете сеть для подключения одного Docker-контейнера к другому, и позволит вам установить первоначальное соединение. Подключение к другому контейнеру с помощью Docker compose

=============================================== ====

Фактический ответ:

var mysql      = require('mysql');
var connection = mysql.createConnection({
  host     : 'localhost',
  user     : 'me',
  password : 'secret',
  database : 'my_db'
});

По сути, для библиотеки mysql требуется имя хоста, которое в большинстве случаев является localhost, но в качестве связывающих контейнеров с помощью docker-compose вы используете псевдоним контейнера. Номер порта по умолчанию 3306

Итак: host: "topsectiondb" хватит!

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