首页 > 解决方案 > Docker NodeJS 与 MySQL 连接 ECONNREFUSED 127.0.0.1:8000

问题描述

我有 2 个容器,即 mysql 和 nodejs。但是,我的nodejs和mysql之间的连接似乎没有连接。错误是

connect ECONNREFUSED 127.0.0.1:8000 

我的 server.js 文件

//Connection with database
var mysql = require('mysql');
var con = mysql.createConnection({
  host: "localhost",
  port: "8000",
  user: "root",
  password: "root",
  database: "justcall"
});

  con.connect(function(err){
          if(err){
            console.log('Database connection error: ' + err.message);
          }else{
            console.log('Database connection successful');
          }
        });

我的 nodejs 的 Dockerfile

FROM node:12
RUN useradd -ms /bin/bash admin
WORKDIR /app
COPY . /app
RUN chown -R admin:admin /app
RUN chmod 755 /app
USER admin
CMD npm start
EXPOSE 4443
我使用构建图像

docker build -t nodejs:signalingserver2

我使用运行容器

docker run -p 4443:4443 nodejs:signalingserver2

我的 mysql docker-compose 是

version: '3'
services:

  mysql:
        image: mysql:8.0
        container_name: mysql-server-80
#        command: --default-authentication-plugin=msql_native_password
#       working dir: /application
        volumes:
          - .:/application
        restart: always
        ports:
          - '3306:3306'
        expose:
          - '3306'
        environment:
          - MYSQL_ROOT_PASSWORD=root
          - MYSQL_DATABASE=mydb
          - MYSQL_USER=root
          - MYSQL_PASSWORD=root
  phpmyadmin:
    depends_on:
      - mysql
    image: phpmyadmin/phpmyadmin
    container_name: phpmyadmin
    restart: always
    ports:
      - "8080:80"
    links:
      - mysql
    environment:
      PMA_HOSTS: mysql

  php:
    container_name: php
    image: php:php_img
    build:
      context: ./
    volumes:
      - /root/app/xampp/justcall:/var/www/html
    ports:
      - 8000:80
    depends_on:
      - mysql
    restart: always

问题是每次我运行我的 nodejs 服务器时,它都会出现一个错误,即 ECONNREFUSED

标签: mysqlnode.jsdocker

解决方案


您正在尝试连接 php-myadmin,而不是 MySQL。

尝试将您的连接更改为

//Connection with database
var mysql = require('mysql');
var con = mysql.createConnection({
  host: "mysql",
  port: "3306",
  user: "root",
  password: "root",
  database: "mydb"
});

此外,将 nodejs 容器添加到 docker-compose 或在 nodejs 容器和 MySQL 容器之间添加旧链接。使用localhost时指的是node容器的localhost,所以需要使用docker-networking从nodejs容器连接DB容器。检查服务到服务的通信

docker run -it --link mysql -p 4443:4443 nodejs:signalingserver2

另外,取消注释command: --default-authentication-plugin=msql_native_password,mysql 8 不支持普通身份验证。

使用 docker-compose 可以

version: '3'
services:

  mysql:
    image: mysql:8.0
    command: --default-authentication-plugin=msql_native_password
    ports:
      - '3306:3306'
    environment:
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_DATABASE=mydb
      - MYSQL_USER=root
      - MYSQL_PASSWORD=root
  nodejs:
    image: nodejs:signalingserver2
    ports:
      - '4443:4443'

推荐阅读