无法在同一个docker中连接nodejs和mysql

时间:2016-06-10 19:44:22

标签: mysql node.js docker econnrefused

我是docker中的新手,我试图让我的nodejs表达在其中运行。 我尝试使用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

我希望任何人都会对如何解决这个问题有一个很好的想法。

3 个答案:

答案 0 :(得分:4)

最佳做法是将微服务的组件分开放在自己的容器中。

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

enter image description here

他确实宣布了两项服务:

        CAT1 CAT2 CAT3 CAT4 CAT5
CASE 1  0.75 0.82 0.85 0.90 0.95
CASE 2  0.65 0.75 0.82 0.87 0.95

使用数据库的专用Dockerfile:

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

答案 1 :(得分:3)

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

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

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

答案 2 :(得分:1)

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