4

我是 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

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

4

3 回答 3

4

最佳实践是将微服务的组件分开保存在各自的容器中。

例如,参见Dave Kerr的“通过构建微服务来学习 Docker ” 。

在此处输入图像描述

他确实宣布了两项服务:

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
于 2016-06-10T20:04:53.577 回答
3

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

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

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

于 2016-06-10T20:04:37.917 回答
1

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

于 2016-06-10T23:50:14.963 回答