2017-07-30 201 views
1

在您將此問題標記爲重複項之前,請注意,我確實已閱讀其他答案,但並未解決我的問題。Node.js連接到MySQL Docker容器ECONNREFUSED

我有由兩個服務碼頭工人組成文件:

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"] 

/網絡/ 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後,服務啓動,但是"wait-for-it.sh"腳本時間等待時出mySQL啓動(所以暫時我沒有在測試數據庫連接時使用它,我只是等到控制檯顯示MySQL已準備好接受傳入連接)

當MySQL從主機我可以登錄使用續集Pro和查詢數據庫,並從./mysql/migrations

enter image description here enter image description here

我也可以SSH得到樣品記錄到運行MySQL容器和做運行一樣。

然而,我的Node.js應用的產量ECONNREFUSED 127.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 
} 
+0

試試你的本地IP - 例如192.168.0。8 – EvgenyKolyakov

+0

@EvgenyKolyakov這不適用於生產環境,因爲我的本地主機不在身邊。 Docker應該鏈接容器。 – ChrisRich

+0

「nodejs」docker內部是否有數據庫服務器? – EvgenyKolyakov

回答

1

此:

mysql: 
    image: mysql:5.7 
    environment: 
    ... 
    ports: 
     - "3307:3306" 

就是說泊塢將主機的3307端口映射到所述容器的3306端口。所以你可以從續集訪問localhost:3307

但是,這並不意味着該容器正在監聽3307;該集裝箱實際上仍在收聽3306。當其他容器嘗試訪問DNS時,它將被轉換爲內部容器IP,因此您必須連接到3306

所以,你的節點的配置應該是這樣的:

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

這在你的搬運工,compose.yml:

command: ["./wait-for-it.sh", "mysql:3306"] 
相關問題