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

Can't connect nodejs and mysql in same docker

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

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

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

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

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

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

Docker 容器设计用于 运行 单个命令。 mysql 安装程序希望它注册的服务在 OS 启动时自动启动,但在容器内部并非如此。

正确的解决方案是将它们分成两个单独的容器,一个数据库容器和另一个 nodejs/app 容器。 Link 和 运行 两者连同 docker-compose 配置自动设置主机名。

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

最佳做法是将微服务的组件单独放在它们自己的容器中。

例如见“Learn Docker by building a Microservice" from Dave Kerr.

他确实声明了两项服务:

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

使用 docker-compose 并为您的 nodejs 创建一个 docker 文件,为 mysql 创建一个文件。每个容器负责做他们的事情。在您的撰写中,link 他们。然后将您的 nodejs 数据库连接指向 mysql 容器。