【问题标题】:Can't connect nodejs and mysql in same docker无法在同一个docker中连接nodejs和mysql
【发布时间】:2016-10-11 21:09:21
【问题描述】:

我是 docker 新手,我正在尝试让我的 nodejs express 在其中运行。 我正在尝试使用 shellscript 安装依赖项及其工作,但最后我无法连接到 mysql。

我的 docker 文件安装 mysql,创建用户和数据库,并安装 nodejs。 然后它运行 npm install 并尝试启动我的应用程序,但 knex 说它无法连接到 mysql 并显示以下消息:

Knex:Error Pool2 - Error: connect ECONNREFUSED /var/run/mysqld/mysqld.sock

这是我正在使用的代码的要点。 (nodejs部分不完整,仅附重要部分):

https://gist.github.com/jradesenv/527f6e59ab2e7985c38fbed3a2084c83

我希望任何人都对如何解决或调试此问题有一个很好的想法。

【问题讨论】:

    标签: mysql node.js docker econnrefused


    【解决方案1】:

    Docker 容器旨在运行单个命令。 mysql 安装程序希望它注册的服务在操作系统启动时自动启动,但在容器内部并非如此。

    正确的解决方案是将它们拆分为两个单独的容器,一个 db 容器和另一个 nodejs/app 容器。使用自动设置主机名的 docker-compose 配置将两者链接并一起运行。

    不太理想的选项是supervisord,您可以使用它来运行和管理容器内的多个进程。您可以像安装任何其他应用程序一样安装它,将您的 db 和节点应用程序配置为两个服务以供 supervisord 管理,然后将 supervisord 作为容器的运行命令启动。

    【讨论】:

      【解决方案2】:

      最佳做法是将微服务的组件单独保存在各自的容器中。

      例如参见 Dave Kerr 中的“Learn Docker by building a Microservice”。

      他确实声明了两项服务:

      version: '2'  
      services:  
        users-service:
          build: ./users-service
          ports:
           - "8123:8123"
          depends_on:
           - db
          environment:
           - DATABASE_HOST=db
        db:
          build: ./test-database
      

      使用数据库专用的 Dockerfile:

      FROM mysql:5
      
      ENV MYSQL_ROOT_PASSWORD 123  
      ENV MYSQL_DATABASE users  
      ENV MYSQL_USER users_service  
      ENV MYSQL_PASSWORD 123
      
      ADD setup.sql /docker-entrypoint-initdb.d
      

      【讨论】:

      • 试过了,我得到了 ECONNREFUSED 127.0.0.1:3306 错误。我的 Compose 文件:版本:'2' 服务:db: build: ./database expose: - “3306” 端口: - “3307:3306” playerground: build: context: . dockerfile:Dockerfile 命令:node_modules/.bin/nodemon --exec npm 启动环境:-DATABASE_HOST=db 端口:-“9090:9090”depends_on:-db 卷:-.:/home/app/playerground -/home/app /playerground/node_modules
      • @ThiagoMirandadeOliveira 有趣。最好将其作为新问题发布以进行更多调查。
      【解决方案3】:

      使用 docker-compose 并为你的 nodejs 和一个 mysql 创建一个 dockerfile。每个容器负责做他们的事情。在您的撰写中,链接它们。然后将你的 nodejs db 连接指向 mysql 容器。

      【讨论】:

        猜你喜欢
        • 2020-06-04
        • 2015-04-30
        • 2017-08-10
        • 2021-02-09
        • 2020-05-05
        • 1970-01-01
        • 2018-06-10
        • 2020-07-24
        • 2021-10-19
        相关资源
        最近更新 更多