Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js连接到MySQL Docker容器_Mysql_Node.js_Docker_Docker Compose - Fatal编程技术网

Node.js连接到MySQL Docker容器

Node.js连接到MySQL Docker容器,mysql,node.js,docker,docker-compose,Mysql,Node.js,Docker,Docker Compose,在您将此问题标记为重复问题之前,请注意,我确实阅读了其他答案,但它并没有解决我的问题 我有一个Docker compose文件,由两个服务组成: version: "3" services: mysql: image: mysql:5.7 environment: MYSQL_HOST: localhost MYSQL_DATABASE: mydb MYSQL_USER: mysql MYSQL_PASSWORD: 1234

在您将此问题标记为重复问题之前,请注意,我确实阅读了其他答案,但它并没有解决我的问题

我有一个Docker compose文件,由两个服务组成:

version: "3"
services:
  mysql:
    image: mysql:5.7
    environment:
      MYSQL_HOST: localhost
      MYSQL_DATABASE: mydb
      MYSQL_USER: mysql
      MYSQL_PASSWORD: 1234
      MYSQL_ROOT_PASSWORD: root
    ports:
      - "3307:3306"
    expose:
      - 3307
    volumes:
      - /var/lib/mysql
      - ./mysql/migrations:/docker-entrypoint-initdb.d
    restart: unless-stopped
  web:
    build:
      context: .
      dockerfile: web/Dockerfile
    volumes:
      - ./:/web
    ports:
      - "3000:3000"
    environment:
      NODE_ENV: development
      PORT: 3000
    links:
      - mysql:mysql
    depends_on:
      - mysql
    expose:
      - 3000
    command: ["./wait-for-it.sh", "mysql:3307"]
/web/Dockerfile:

FROM node:6.11.1

RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

COPY package.json /usr/src/app/
RUN npm install

COPY . /usr/src/app

CMD [ "npm", "start" ]
docker compose up--build
之后,服务启动,但是脚本在等待mySQL启动时超时(所以在测试DB连接时暂时不使用它,我只是等待控制台显示mySQL已准备好接受传入连接)

当MySQL在主机上运行时,我可以使用Sequel Pro登录数据库并从
/MySQL/migrations

我还可以SSH到正在运行的MySQL容器中,并执行相同的操作

但是,我的Node.js应用程序在连接时会产生
econnrefered127.0.0.1:3307

MySQL初始化:

import * as mysql from 'promise-mysql'

const config = {
    host: 'localhost',
    database: 'mydb',
    port: '3307',
    user: 'mysql',
    password: '1234',
    connectionLimit: 10
}

export let db = mysql.createPool(config);
MySQL查询:

import { db } from '../db/client'

export let get = () => {

return db.query('SELECT * FROM users', [])
    .then((results) => {
        return results

    })
    .catch((e) => {
        return Promise.reject(e)
    })
}
点击url时调用的路由/

import { Router } from 'express';
import * as repository from '../repository'
export let router = Router();

router.get('/', async (req, res) => {

    let users;

    try{
        users = await repository.users.get();
    } catch(e){
        // ECONNREFUSED 127.0.0.1:3307
    }

    res.render('index', {
        users: users
    });
});
这不太可能是竞争条件,因为在Node.js失败的同时,我可以使用Sequel Pro或SSH查询正在运行的Docker容器并进行查询。所以这可能是Node.js无法访问MySQL容器的情况

{
    error: connect ECONNREFUSED 127.0.0.1:3307
    code: 'ECONNREFUSED',
    errno: 'ECONNREFUSED',
    syscall: 'connect',
    address: '127.0.0.1',
    port: 3307,
    fatal: true
}
这:

表示Docker将主机的
3307
端口映射到集装箱的
3306
端口。因此,您可以从Sequel访问
localhost:3307

但是,这并不意味着容器正在侦听
3307
;容器实际上仍在侦听
3306
。当其他容器尝试访问
mysql
DNS时,它会被转换为内部容器IP,因此您必须连接到
3306

因此,您的节点配置应该如下所示:

const config = {
    host: 'mysql',
    database: 'mydb',
    port: '3306',
    user: 'mysql',
    password: '1234',
    connectionLimit: 10
}
在docker-compose.yml中:

command: ["./wait-for-it.sh", "mysql:3306"]

试试你的本地ip,例如192.168.0。8@EvgenyKolyakov这在生产环境中不起作用,因为我的本地主机不存在。Docker应该链接容器。“nodejs”Docker中是否有数据库服务器??
command: ["./wait-for-it.sh", "mysql:3306"]