NodeJS + Mysql 与 Docker Compose 2

Posted

技术标签:

【中文标题】NodeJS + Mysql 与 Docker Compose 2【英文标题】:NodeJS + Mysql with Docker Compose 2 【发布时间】:2017-01-27 15:09:02 【问题描述】:

我正在尝试构建一个 docker-compose 文件以在本地部署连接到 mysql 服务器的 NodeJS 应用程序。我已经尝试了一切(在 *** 中阅读了很多教程和一些问题),但我不断收到 ECONNREFUSED 错误。 这是我来自 NodeJS 的 Dockerfile:

##Nodejs

FROM node:latest

RUN useradd --user-group --create-home --shell /bin/false app

ENV HOME=/home/app

COPY package.json npm-shrinkwrap.json $HOME/playerground/
RUN chown -R app:app $HOME/*

USER app 
WORKDIR $HOME/playerground
RUN npm cache clean && npm install --silent --progress=false

USER root
COPY . $HOME/playerground
RUN chown -R app:app $HOME/*
USER app

这是我的 Mysql Dockerfile:

FROM mysql:latest

ENV MYSQL_ROOT_PASSWORD root  
ENV MYSQL_DATABASE playerground  
ENV MYSQL_USER root  
ENV MYSQL_PASSWORD root

这是我的 docker-compose:

version: '2'
services: 
  db:
    build: ./database
    ports:
      - "3307:3306"  
  playerground:
      build:
        context: .
        dockerfile: Dockerfile
      command: node_modules/.bin/nodemon --exec npm start
      environment:
        ENVIRONMENT: development
      ports:
        - "9090:9090"
      links:
        - db  
      volumes:      
        - .:/home/app/playerground
        - /home/app/playerground/node_modules

另一件事是我来自 Nodejs 的配置文件:

//Database
'development' : 
  'host' : process.env.HOSTNAME || 'localhost',
  'user' : 'root',
  'password' : 'root',
  'database' : 'playerground'
,
//Server
'development' : 
  'host' : process.env.HOSTNAME || '127.0.0.1',
  'port' : 3000
,

你能帮帮我吗? 谢谢

【问题讨论】:

【参考方案1】:

在您的应用配置中,数据库主机未指向您的 MySql 容器。您将其指向本地主机,即应用程序容器。在 Compose 文件中,您可以使用以下命令显式命名指向 db 容器的链接:

  links:
    - db:db  

然后可以通过主机名db 访问您的数据库容器。您可以在应用配置中对该主机进行硬编码,因为它对于所有环境都是相同的,只要您使用相同的 Compose 文件。

此外,如果您使用的是最新版本的 Docker,则无需在同一 Docker 网络中的容器之间发布端口 - 因此您可以将其从 Compose 文件中删除:

ports:
  - "3307:3306"  

那么 db 容器将可以被 app 容器访问,但不能被外部访问。

【讨论】:

谢谢。显然它解决了 ECONNREFUSED 但它给了我一个 ER_HOST_NOT_PRIVILEGED 错误。你知道发生了什么吗?谢谢! This question 可能有答案 - 看起来像是 MySql 用户的权限问题。为您的 Node db 用户尝试 GRANT ALL PRIVILEGES... 我已经尝试使用脚本并将其添加到我的 Dockerfile “ADD setup.sql /docker-entrypoint-initdb.d”,但它没有工作。但我会尝试在这里继续测试。非常感谢!!

以上是关于NodeJS + Mysql 与 Docker Compose 2的主要内容,如果未能解决你的问题,请参考以下文章

docker-compose:nodejs + mysql无法连接mysql

docker nodejs容器无法连接mysql容器

将 NodeJS Docker 容器连接到 MySQL Docker 容器 - docker-compose 3

聊聊docker容器安装nodejs环境遇到的坑

Docker-compose.yml for NodeJs with MySQL on AWS Elastic Beanstalk 单容器 Docker

尝试通过 docker-compose 将 NodeJS 应用程序连接到 MySQL 映像时出现 ECONNREFUSED