【问题标题】:My docker-compose not working properly when I try to connect mysql with nodejs [duplicate]当我尝试将 mysql 与 nodejs 连接时,我的 docker-compose 无法正常工作 [重复]
【发布时间】:2018-11-09 18:34:23
【问题描述】:

这是我的 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)

它就像连接未设置但已设置

【问题讨论】:

  • 你也应该在这里分享你的撰写文件
  • (但这不是完全正确...您的代码显然错误地尝试连接到 127.0.0.1,但您有 DATABASE_HOST=db 环境变量设置应该是通过了。你代码中的端口错了,还和报错信息中的端口不匹配?)

标签: docker docker-compose


【解决方案1】:

这里发生了 3 件事:

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

要修复第二点,您应该检查您的 mysql 配置中的 bind 部分。 (查找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. 如果为您的 mysql 配置设置了正确的 ip,则第二个选项可能会起作用。
  3. 第三个选项的作用是 mysql 现在配置为允许所有远程连接。

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

[mysqld]
bind-address = 0.0.0.0

【讨论】:

    【解决方案2】:

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

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

    networks:
      backend:
        driver: 'bridge'
    

    并为每个容器添加:

    networks:
    - backend
    

    【讨论】:

    • 任何足以理解version: '3.2' 的 Docker Compose 都会在幕后自动为您执行此操作。
    猜你喜欢
    • 2020-05-10
    • 2018-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多