将npm api连接到MySQL时的docker ECONNREFUSED

时间:2019-05-06 00:30:07

标签: mysql node.js docker npm

您好,我正在尝试获取一个简单的nodeJS API应用程序,以使用docker处理MySQL数据库中的数据。但是我遇到了ECONNREFUSED错误,我认为这是因为我设置容器/端口/ ips的方式导致API容器无法与MySQL容器进行通信。我将在下面说明我的工作流程:

//start docker network mysql-net
docker network create --driver bridge mysql-net
//Launch a docker container running a MySQL server in detached mode
docker run -d --name mysql-server --network mysql-net -p 3306:3306 -e "MYSQL_ROOT_PASSWORD=rootpassword" -e "MYSQL_DATABASE=bookaplace" -e "MYSQL_USER=bookaplace" -e "MYSQL_PASSWORD=hunter2" mysql:5

这时,我通过命令行连接到mysql服务器,并在'bookaplace'数据库中手动创建了'lodgings'表。我使用插入语句向该表添加数据。

我位于API Web应用程序的文件夹中,其中包括我的dockerfile:

FROM node:11
WORKDIR /usr/src/app
COPY . .
RUN npm install
ENV PORT=8000
EXPOSE ${PORT}
CMD [ "npm", "start" ]

我可以使用“ npm start”在本地运行我的应用程序,并且可以正确启动。

//build image from dockerfile
docker build -t book-a-place-api .

//launch docker book-a-place-api container to port 8000
docker run -d --name book-a-place-api --network mysql-net -p 8000:8000 book-a-place-api

因此,现在我已经启动并正在运行我的book-a-place-api容器和mysql-server容器。 我正在尝试仅使一个端点正常工作,即获取对/ lodgings的请求。我使用http://localhost:8000/lodgings访问此请求,并在book-a-place-api日志中看到与MySQL数据库的连接失败:

enter image description here

我认为这与即时通讯连接到我的mysql-server容器有关吗?在我的book-a-place-api文件中,我尝试使用以下代码连接到mysql数据库:

const mysqlHost = 'mysql-net'; 
const mysqlPort = 3306; 
const mysqlDBName = 'bookaplace';
const mysqlUser = 'root';
const mysqlPassword = 'rootpassword'; 

const mysqlPool = mysql.createPool({
  connectionLimit : 1000,
  connectTimeout  : 60 * 60 * 1000,
  acquireTimeout  : 60 * 60 * 1000,
  timeout         : 60 * 60 * 1000,
  host: mysqlHost,
  port: mysqlPort,
  database: mysqlDBName,
  user: mysqlUser,
  password: mysqlPassword
});

1 个答案:

答案 0 :(得分:0)

要连接的DNS名称是容器名称mysql-server,而不是网络名称mysql-net。使用以下文件更新文件:

const mysqlHost = 'mysql-server'; 
const mysqlPort = 3306; 
const mysqlDBName = 'bookaplace';
const mysqlUser = 'root';
const mysqlPassword = 'rootpassword'; 

const mysqlPool = mysql.createPool({
  connectionLimit : 1000,
  connectTimeout  : 60 * 60 * 1000,
  acquireTimeout  : 60 * 60 * 1000,
  timeout         : 60 * 60 * 1000,
  host: mysqlHost,
  port: mysqlPort,
  database: mysqlDBName,
  user: mysqlUser,
  password: mysqlPassword
});