使用 docker-compose 连接 SQL 服务器和 nodejs
Connect SQL Server and nodejs with docker-compose
我有 docker-compose.yml:
version: "3.7"
services:
app:
build: .
ports:
- 3000:3000
working_dir: /app
volumes:
- ./:/app
depends_on:
- db
db:
image: "mcr.microsoft.com/mssql/server:2019-latest"
ports:
- 1433:1433
environment:
SA_PASSWORD: "Thieu@098551298"
ACCEPT_EULA: "Y"
volumes:
- mssql-data:/var/opt/mssql
volumes:
mssql-data:
文件 Dockerfile:
FROM node:12-alpine
ENV NODE_ENV=production
WORKDIR /app
COPY ["package.json", "package-lock.json*", "./"]
RUN npm install --production
COPY . .
CMD [ "node", "server.js" ]
文件server.js:
var express = require("express");
var app = express();
var { ExecuteSQL } = require("./sql");
app.get("/", async (req, res) => {
var s = await ExecuteSQL("select *from post");
res.send(s.recordset);
});
app.listen(3000, () => console.log("listening on port 3000"));
和sql.js:
var sql = require("mssql");
var config = {
user: "sa",
password: "Thieu@098551298",
server: "localhost",
database: "blog",
options: {
enableArithAbort: true,
trustServerCertificate: true,
},
};
function ExecuteSQL(query) {
return new Promise((resolve, reject) => {
sql.connect(config, (err, db) => {
if (err) reject(err);
var request = new sql.Request();
request.query(query, (err, db) => {
if (err) reject(err);
resolve(db);
});
});
});
}
async function z() {
var z = await ExecuteSQL("select *from post");
console.log(z.recordsets);
}
z();
module.exports = {
ExecuteSQL: ExecuteSQL,
};
第 1 步:我 运行 这个 cmd:docker-compose up -d(这将 运行ning 两个容器数据库和应用程序)
第 2 步:我打开浏览器转到 http://localhost:3000/(我的目标是当我 select *from post 来自 server.js 文件)但它会抛出错误:
UnhandledPromiseRejectionWarning: ConnectionError: Failed to connect to localhost:1433 - Could not connect (sequence)
但是当我 运行 cmd: node sql - 它可以连接到容器中的 SQL 服务器并显示数据,因为我在 [=18= 中具有测试功能]:
async function z() {
var z = await ExecuteSQL("select *from post");
console.log(z.recordsets);
}
z();
数据显示:
[
[
{
id: 1,
title: 'How to learn docker',
content: ' qjweqwn ejqwne qwne nqwje nqwjen qjwne ojqwne jqwn'
},
{
id: 2,
title: 'How to learn english',
content: ' qwen qwen qjen qw'
}
]
]
我已经提供了必要的信息,那么app容器有什么方法可以连接到db容器并获取数据吗?也许我应该在 docker-compose.yml 文件中编辑更多内容?
您提供了错误的服务器地址。永远不要忘记 dockers 中的“localhost”意味着在 docker.
中
修复此配置服务器地址“db”
我有 docker-compose.yml:
version: "3.7"
services:
app:
build: .
ports:
- 3000:3000
working_dir: /app
volumes:
- ./:/app
depends_on:
- db
db:
image: "mcr.microsoft.com/mssql/server:2019-latest"
ports:
- 1433:1433
environment:
SA_PASSWORD: "Thieu@098551298"
ACCEPT_EULA: "Y"
volumes:
- mssql-data:/var/opt/mssql
volumes:
mssql-data:
文件 Dockerfile:
FROM node:12-alpine
ENV NODE_ENV=production
WORKDIR /app
COPY ["package.json", "package-lock.json*", "./"]
RUN npm install --production
COPY . .
CMD [ "node", "server.js" ]
文件server.js:
var express = require("express");
var app = express();
var { ExecuteSQL } = require("./sql");
app.get("/", async (req, res) => {
var s = await ExecuteSQL("select *from post");
res.send(s.recordset);
});
app.listen(3000, () => console.log("listening on port 3000"));
和sql.js:
var sql = require("mssql");
var config = {
user: "sa",
password: "Thieu@098551298",
server: "localhost",
database: "blog",
options: {
enableArithAbort: true,
trustServerCertificate: true,
},
};
function ExecuteSQL(query) {
return new Promise((resolve, reject) => {
sql.connect(config, (err, db) => {
if (err) reject(err);
var request = new sql.Request();
request.query(query, (err, db) => {
if (err) reject(err);
resolve(db);
});
});
});
}
async function z() {
var z = await ExecuteSQL("select *from post");
console.log(z.recordsets);
}
z();
module.exports = {
ExecuteSQL: ExecuteSQL,
};
第 1 步:我 运行 这个 cmd:docker-compose up -d(这将 运行ning 两个容器数据库和应用程序)
第 2 步:我打开浏览器转到 http://localhost:3000/(我的目标是当我 select *from post 来自 server.js 文件)但它会抛出错误:
UnhandledPromiseRejectionWarning: ConnectionError: Failed to connect to localhost:1433 - Could not connect (sequence)
但是当我 运行 cmd: node sql - 它可以连接到容器中的 SQL 服务器并显示数据,因为我在 [=18= 中具有测试功能]:
async function z() {
var z = await ExecuteSQL("select *from post");
console.log(z.recordsets);
}
z();
数据显示:
[
[
{
id: 1,
title: 'How to learn docker',
content: ' qjweqwn ejqwne qwne nqwje nqwjen qjwne ojqwne jqwn'
},
{
id: 2,
title: 'How to learn english',
content: ' qwen qwen qjen qw'
}
]
]
我已经提供了必要的信息,那么app容器有什么方法可以连接到db容器并获取数据吗?也许我应该在 docker-compose.yml 文件中编辑更多内容?
您提供了错误的服务器地址。永远不要忘记 dockers 中的“localhost”意味着在 docker.
中修复此配置服务器地址“db”