无法在同一 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 容器。
我是 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 容器。