mysql хост не разрешается с docker контейнером для Nodejs и express - PullRequest
0 голосов
/ 05 марта 2020

Я пытаюсь использовать NodeJS + Express, MySQL, phpmyadmin в целом. Сам phpmyadmin разрешает адрес по порту 8183 в моей ситуации. Но всякий раз, когда я собираюсь подключить его через mysql js пакет NodeJS. это не работает и выдает ошибку

Error: connect ECONNREFUSED 127.0.0.1:3306

Примечание: я пробовал с несколькими вариантами, так как хост никто не работал для меня!

пример: mysql, my_machine_ip, localhost, 0.0.0.0

у меня ничего не получалось.

Вот мой yml файл.

version : '3'

services:
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    container_name: node_pa
    links:
      - mysql
    depends_on:
      - mysql
    environment:
      PMA_HOST: mysql
      PMA_PORT: 3306
      PMA_ARBITRARY: 1
    restart: always
    ports:
      - 8183:80
  node_backend:
    container_name: node_with_pa_msql
    build: ./backend_app
    # volumes: 
    #   - ./backend_app:/usr/src/app
    links:
      - mysql
    depends_on:
      - mysql
    restart: on-failure
    ports:
      - 3004:4006
  mysql:
    image: mysql:latest
    container_name: node_mysql
    # volumes:
    #   - backend_app/db_sample:/docker-entrypoint-initdb.d
    environment:
      MYSQL_USER: user
      MYSQL_PASSWORD: user
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: default_schema

И mysqlJS Сведения о соединении

// environment variables
const PORT = process.env.PORT || 4006;
const HOST = process.env.HOST || 'localhost';

// // mysql credentials
const connection = mysql.createConnection({
    host: HOST,
    user: process.env.MYSQL_USER || 'root',
    password: process.env.MYSQL_PASSWORD || 'root',
    connectTimeout: 20000
});

Итак, phpmyadmin работает, и я могу получить доступ к базам данных / создать / удалить / редактировать таким образом, так что это гарантирует, что mysql само по себе также работает, но сейчас я не могу подключиться это с mysqlJS моего nodejs приложения.

вот пример проекта с проблемой, если вы хотите попробовать на своей машине проект GitHub ссылка с файлом YAML

Примечание. Проверка ответа добавила полное решение этой проблемы.

Ответы [ 2 ]

0 голосов
/ 05 марта 2020

Наконец, после большого беспорядка, решил эту проблему!

С указанным выше YAML файлом. все почти нормально, но главная проблема - порядок изображений.

Это означает, что у меня всего 3 изображения из них node зависит от mysql. Поэтому сначала необходимо запустить mysql, чтобы вы могли подключиться к mysql и использовать его с вашим приложением (nodeJS). Это причина, почему ни один хост не разрешал мою реализацию.

Я следовал за этой статьей: https://docs.docker.com/compose/startup-order/

и для примера реализации это: https://dev.to/hugodias/wait-for-mongodb-to-start-on-docker-3h8b

Вы сделали! Теперь используйте нужный драйвер

Сейчас

это спецификация пакета узла (mysqlJS) c. сам по себе пакет не поддерживает последние версии mysql, и если вы используете последние теги mysql mysql:latest, то вы можете столкнуться с этой проблемой.

Error: ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading MySQL client docker mysql node

быстрое решение понизьте его до более низкого, пока оно не заработает. Я не уверен насчет минимальной версии, но mysql:5.6 работает!

Если вы хотите быстрый старт со всем приложением phpmyadmin, mysql, nodejs, тогда вы можете использовать этот репозиторий: Здесь

0 голосов
/ 05 марта 2020

Я предполагаю, что экземпляр phpMyAdmin работает, так как вы на самом деле правильно передаете env var PMA_HOST и PMA_PORT в контейнер.

Вам необходимо сделать то же самое для JS приложение, так что ваша docker -композитная конфигурация будет выглядеть следующим образом:

  node_backend:
    container_name: node_with_pa_msql
    build: ./backend_app
    # volumes: 
    #   - ./backend_app:/usr/src/app
    environment:
      MYSQL_HOST: mysql
      MYSQL_PORT: 3306
    links:
      - mysql
    depends_on:
      - mysql
    restart: on-failure
    ports:
      - 3004:4006

Тогда в вашем коде JS вам нужно получить информацию о соединении из переменных env:

// environment variables
const PORT = process.env.MYSQL_PORT || 4006;
const HOST = process.env.MYSQL_HOST || 'localhost';

// // mysql credentials
const connection = mysql.createConnection({
    host: HOST,
    port: PORT,
    user: process.env.MYSQL_USER || 'root',
    password: process.env.MYSQL_PASSWORD || 'root',
    connectTimeout: 20000
});

Это работает, потому что когда вы связываете контейнер mysql, запись хоста добавляется в ваш контейнер js, что заставляет имя хоста mysql указывать на (docker внутренний) ip-адрес контейнера mysql .

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