Докер ECONNREFUSED при подключении npm api к MySQL - PullRequest
0 голосов
/ 06 мая 2019

Здравствуйте. Я пытаюсь заставить простое приложение API nodeJS работать с данными в базе данных MySQL, используя docker. Но я сталкиваюсь с ошибкой ECONNREFUSED, и я думаю, что это из-за способа, которым я настраиваю свои контейнеры / порты / ips, который мешает моему контейнеру API общаться с моим контейнером MySQL. Ниже я проиллюстрирую свой рабочий процесс:

//start docker network mysql-net
docker network create --driver bridge mysql-net
//Launch a docker container running a MySQL server in detached mode
docker run -d --name mysql-server --network mysql-net -p 3306:3306 -e "MYSQL_ROOT_PASSWORD=rootpassword" -e "MYSQL_DATABASE=bookaplace" -e "MYSQL_USER=bookaplace" -e "MYSQL_PASSWORD=hunter2" mysql:5

На этом этапе я подключаюсь к mysql-серверу через командную строку и вручную создаю таблицу 'lodgings' в базе данных 'bookaplace'. Я добавляю данные в эту таблицу с помощью оператора вставки.

Я нахожусь в папке для моего веб-приложения API, в которую входит мой dockerfile:

FROM node:11
WORKDIR /usr/src/app
COPY . .
RUN npm install
ENV PORT=8000
EXPOSE ${PORT}
CMD [ "npm", "start" ]

Я могу запустить свое приложение локально, используя 'npm start', и оно запускается правильно.

//build image from dockerfile
docker build -t book-a-place-api .

//launch docker book-a-place-api container to port 8000
docker run -d --name book-a-place-api --network mysql-net -p 8000:8000 book-a-place-api

Итак, на данный момент у меня есть и мой контейнер book-a-place-api, и контейнер mysql-server. Я пытаюсь заставить работать только одну конечную точку, запрос get в / lodgings. Я получаю доступ к этому запросу с помощью http://localhost:8000/lodgings и вижу в журналах book-a-place-api, что не удалось подключиться к базе данных MySQL:

enter image description here

Я думаю, это как-то связано с тем, как я подключаюсь к своему контейнеру mysql-сервера? В моих файлах book-a-place-api я пытаюсь подключиться к базе данных mysql с помощью этого кода:

const mysqlHost = 'mysql-net'; 
const mysqlPort = 3306; 
const mysqlDBName = 'bookaplace';
const mysqlUser = 'root';
const mysqlPassword = 'rootpassword'; 

const mysqlPool = mysql.createPool({
  connectionLimit : 1000,
  connectTimeout  : 60 * 60 * 1000,
  acquireTimeout  : 60 * 60 * 1000,
  timeout         : 60 * 60 * 1000,
  host: mysqlHost,
  port: mysqlPort,
  database: mysqlDBName,
  user: mysqlUser,
  password: mysqlPassword
});

1 Ответ

0 голосов
/ 06 мая 2019

DNS-имя для подключения - это имя контейнера, mysql-server, а не имя сети mysql-net. Обновите ваш файл:

const mysqlHost = 'mysql-server'; 
const mysqlPort = 3306; 
const mysqlDBName = 'bookaplace';
const mysqlUser = 'root';
const mysqlPassword = 'rootpassword'; 

const mysqlPool = mysql.createPool({
  connectionLimit : 1000,
  connectTimeout  : 60 * 60 * 1000,
  acquireTimeout  : 60 * 60 * 1000,
  timeout         : 60 * 60 * 1000,
  host: mysqlHost,
  port: mysqlPort,
  database: mysqlDBName,
  user: mysqlUser,
  password: mysqlPassword
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...