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

我是新的docker工人,我试图让我的nodejs运行在里面。 我试图安装依赖使用贝壳和它的工作,但最后我无法连接到MySQL。

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

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

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

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

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

Docker容器被devise为运行一个命令。 mysql安装程序希望它注册的服务自动在操作系统启动时启动,但容器内部并不是这样。

正确的解决scheme是将它们分成两个单独的容器,一个数据库容器和另一个nodejs / app容器。 链接并运行这两个自动设置主机名的docker-composeconfiguration。

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

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

请参阅Dave Kerr的 “ 通过构build微服务来学习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 

使用docker-compose为你的nodejs和mysql创build一个dockerfile。 每个容器负责做他们的事情。 在你的作文中,链接它们。 然后将你的nodejs数据库连接指向mysql容器。

Interesting Posts