【问题标题】:Docker NodeJS with MySQL connect ECONNREFUSED 127.0.0.1:8000Docker NodeJS 与 MySQL 连接 ECONNREFUSED 127.0.0.1:8000
【发布时间】:2020-04-09 23:45:24
【问题描述】:

我有 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

【问题讨论】:

  • 问题可能无法到达端点并且服务器可能没有在该端口上运行
  • 是这个问题吗?我得到“无法可靠地确定服务器的完全限定域名,使用 172.18.0.4。全局设置 'ServerName' 指令以禁止显示此消息”。所以我将 ip 从 localhost 更改为 172.18.0.4 但我得到了新错误,即 ETIMEDOUT

标签: mysql node.js docker


【解决方案1】:

您正在尝试连接 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 时,它指的是节点容器的本地主机,因此您需要使用 docker-networking 从 nodejs 容器连接 DB 容器。检查service to service communication

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'

【讨论】:

  • 当我使用 docker run -it --link mysql -p 4443:4443 nodejs:signalingserver2 时,我收到一个错误“无法在本地 docker 找到图像 'nodejs:signalserver':来自守护进程的错误响应:拒绝 nodejs 的拉取访问,存储库不存在或可能需要 'docker login':拒绝:请求的资源访问被拒绝。”
  • 但是,我可以通过 docker-compose 运行。我对此还是很陌生,而且有点令人困惑。
猜你喜欢
  • 2021-01-04
  • 2019-05-28
  • 1970-01-01
  • 2023-03-18
  • 2021-11-24
  • 2021-11-01
  • 2022-11-03
  • 1970-01-01
相关资源
最近更新 更多