当我尝试将MySQL与Node.js连接时,我的docker-compose无法正常工作

时间:2018-11-09 18:34:23

标签: docker docker-compose

这是我的db.js文件

let connection = mysql.createConnection({
host: process.env.DATABASE_HOST || '127.0.0.1',
user: 'root',
database: 'bc2k19',
password: 'joeydash',
port: 33060
});

这是我的docker-compose.yml文件

version: '3.2'
services:
  app:
    build: ./app
    ports:
    - "3000:3000"
    depends_on:
    - db
    environment:
    - DATABASE_HOST=db
  db:
    build: ./db
    ports:
    - "3306:3306"

这是我的mysql的dockerfile

FROM mysql:latest

ENV MYSQL_ROOT_PASSWORD joeydash
ENV MYSQL_DATABASE bc2k19
ENV MYSQL_USER joeydash
ENV MYSQL_PASSWORD joeydash

ADD setup.sql /docker-entrypoint-initdb.d

这是我的应用程序的dockerfile

# Use Node v4 as the base

 image.
FROM node:latest

# Add everything in the current directory to our image, in the 'app' folder.
ADD . /app

# Install dependencies
RUN cd /app; \
    npm install --production

# Expose our server port.
EXPOSE 3000

# Run our app.
CMD ["node", "/app/bin/www"]

我不知道为什么每次尝试做docker-compose up并连接时都会显示

     Error: connect ECONNREFUSED 127.0.0.1:3306
app_1  |     at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1117:14)

像未设置连接但已设置的鞋子

2 个答案:

答案 0 :(得分:2)

这里发生了三件事:

  1. 您在nodejs应用(db.js)中的端口号有错字。
    • 33060更改为3306
  2. 您的用户是root,但环境中的用户是joeydash
    • root更改为joeydash
  3. 由于默认情况下将Mysql设置为侦听localhost,因此它可能会阻止您的连接。在容器世界localhost中,大部分时间(如果并非总是指向容器内部)。

要修复第二点,您应该检查bind部分的mysql配置。 (寻找bind-address)确保它允许您运行其他容器的ip连接。

  
      
  • 如果MySQL绑定到127.0.0.1,则   同一台计算机上只有软件   将能够连接(因为   127.0.0.1始终是本地计算机)。
  •   
  • 如果MySQL绑定到   192.168.0.2(并且服务器计算机的IP地址为   192.168.0.2,并且它位于/ 24子网中),那么同一台计算机上的所有计算机   子网(以192.168.0开头的任何子网)都可以连接。
  •   
  • 如果MySQL绑定到   0.0.0.0,那么任何能够访问服务器计算机的计算机   通过网络将能够连接。
  •   

从这里https://stackoverflow.com/a/3552946/2724940

报价

如果我们经历每种情况:

  1. 第一个失败,因为所有容器都有自己的localhost
  2. 如果将正确的IP设置为mysql配置,则第二个选项可以工作。
  3. 第三个选项可以正常工作,因为mysql现在已配置为允许所有远程连接。

my.cnf(位于/etc/mysql/my.cnf

[mysqld]
bind-address = 0.0.0.0

答案 1 :(得分:1)

根据您的docker compose版本,您可能需要创建网络或链接容器。

docker-compose.yml的末尾,您可以添加:

networks:
  backend:
    driver: 'bridge'

然后为每个容器添加:

networks:
- backend