您好,我正在尝试获取一个简单的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数据库的连接失败:
我认为这与即时通讯连接到我的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
});
答案 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
});