【问题标题】:mysql host not resolving with docker container for Nodejs and expressmysql 主机无法使用 Nodejs 和 express 的 docker 容器解析
【发布时间】:2020-06-18 01:27:28
【问题描述】:

我正在尝试完全使用 NodeJS+Express、MySQL、phpmyadmin。在我的情况下,phpmyadmin 本身通过端口8183 解析地址。但是每当我要通过 NodeJS 的 mysql js 包连接它时。它不工作并抛出错误

Error: connect ECONNREFUSED 127.0.0.1:3306

注意:作为主持人,我尝试了一些变化,但没有人为我工作!

例如:mysql, my_machine_ip, localhost, 0.0.0.0

没有什么对我有用。

这是我的yml 文件。

version : '3'

services:
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    container_name: node_pa
    links:
      - mysql
    depends_on:
      - mysql
    environment:
      PMA_HOST: mysql
      PMA_PORT: 3306
      PMA_ARBITRARY: 1
    restart: always
    ports:
      - 8183:80
  node_backend:
    container_name: node_with_pa_msql
    build: ./backend_app
    # volumes: 
    #   - ./backend_app:/usr/src/app
    links:
      - mysql
    depends_on:
      - mysql
    restart: on-failure
    ports:
      - 3004:4006
  mysql:
    image: mysql:latest
    container_name: node_mysql
    # volumes:
    #   - backend_app/db_sample:/docker-entrypoint-initdb.d
    environment:
      MYSQL_USER: user
      MYSQL_PASSWORD: user
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: default_schema

和mysqlJS的连接细节

// environment variables
const PORT = process.env.PORT || 4006;
const HOST = process.env.HOST || 'localhost';

// // mysql credentials
const connection = mysql.createConnection({
    host: HOST,
    user: process.env.MYSQL_USER || 'root',
    password: process.env.MYSQL_PASSWORD || 'root',
    connectTimeout: 20000
});

所以,phpmyadmin 正在工作,我可以通过它访问数据库/创建/删除/编辑,这样可以确保 mysql 本身也可以工作,但是现在我无法将它与我的 nodejs 应用程序的 mysqlJS 连接。

如果您想在您的机器上试用,这里是有问题的示例项目project GitHub link with YAML file

注意:检查答案添加了此问题的完整解决方案。

【问题讨论】:

  • 你的mysql数据库在哪个端口运行?
  • @SeppeMariën 这是3306 我相信默认端口。
  • 如何启动 docker?或者,如果可能的话,您能否提供 docker 桌面的快照
  • @SeppeMariën 这是我用来测试的完整代码。你可以检查并尝试github.com/MahbbRah/docker_mysql_node_phpmyadmin.git
  • 你使用docker桌面吗?

标签: mysql node.js docker docker-compose


【解决方案1】:

我假设 phpMyAdmin 实例正在工作,因为您实际上正在将环境变量 PMA_HOSTPMA_PORT 正确传递给容器。

您需要对 JS 应用程序执行相同的操作,因此您的 docker-compose 配置将如下所示:

  node_backend:
    container_name: node_with_pa_msql
    build: ./backend_app
    # volumes: 
    #   - ./backend_app:/usr/src/app
    environment:
      MYSQL_HOST: mysql
      MYSQL_PORT: 3306
    links:
      - mysql
    depends_on:
      - mysql
    restart: on-failure
    ports:
      - 3004:4006

然后在你的 JS 代码中你需要从你的环境变量中获取连接信息:

// environment variables
const PORT = process.env.MYSQL_PORT || 4006;
const HOST = process.env.MYSQL_HOST || 'localhost';

// // mysql credentials
const connection = mysql.createConnection({
    host: HOST,
    port: PORT,
    user: process.env.MYSQL_USER || 'root',
    password: process.env.MYSQL_PASSWORD || 'root',
    connectTimeout: 20000
});

这是有效的,因为当您链接 mysql 容器时,会在您的 js 容器中添加一个 hosts 条目,这使得主机名 mysql 指向 mysql 容器的(docker 内部)IP 地址。

【讨论】:

  • 你说的很好。但这不是问题。我可以将它直接传递给我的环境变量。我相信这是另一回事。你可以试试这个来源。 github.com/MahbbRah/docker_mysql_node_phpmyadmin.git
  • @CodeCooker 我的意思是它错误地尝试连接到127.0.0.1:3306,它应该是mysql容器。 phpMyAdmin 是否工作?
  • 请正确阅读我的问题。我尝试了所有的变体:例如:mysql, my_machine_ip, localhost, 0.0.0.0 它对所有人都是一样的。
  • 我认为我们需要这样的东西,docs.docker.com/compose/startup-order,但我不确定如何在这个项目中实施。
  • 好的,在设置环境变量后(如我的示例中),尝试连接到 sql 服务器导致 ER_HOST_NOT_PRIVILEGED 错误。这意味着仍然必须在数据库中创建一个用户,例如user@%,以允许来自任何 IP 地址的连接。 (您可以使用 mysql-entrypoint 文件来实现此目的或手动设置一次)。您还需要更多帮助吗?
【解决方案2】:

终于在乱七八糟之后,解决了这个问题!

上面提到的YAML文件。一切都差不多了,但主要问题是图像的顺序。

这意味着我总共有 3 张图片来自他们 node 依赖于 mysql。所以首先必须启动mysql,然后你才能获得mysql的连接并将它与你的应用程序(nodeJS)一起使用。这就是为什么任何主机都没有解决我的实现的原因。

我关注了这篇文章:https://docs.docker.com/compose/startup-order/

对于实现示例:https://dev.to/hugodias/wait-for-mongodb-to-start-on-docker-3h8b

你已经完成了!现在使用您想要的驱动程序

现在

这是特定于节点(mysqlJS)包的。该软件包本身不支持最新的 mysql,如果您使用最新标记的 mysql mysql:latest 那么您可能会遇到这个问题。

Error: ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading MySQL client docker mysql node

快速解决方案将其降级到更低,直到它起作用。我不确定最低版本,但mysql:5.6 有效!

如果你想要一个快速入门的一切 phpmyadmin、mysql、nodejs 应用程序 那么你可以使用这个仓库:Here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-09
    • 2017-04-12
    • 2015-05-29
    • 1970-01-01
    • 2018-02-13
    • 2021-06-27
    相关资源
    最近更新 更多