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