我正在尝试让我的节点Express docker容器与我的mysqldb容器通信。但是当我查询时,我总是得到:'connect ECONNREFUSED 127.0.0.1:3306'。我在做什么错了?
这是我的docker-compose.yml。它旋转了我的两个容器。如果我不使用容器而使用express,则my-api可以工作。但不是一成不变。当它在docker中运行时,express似乎路由不错,但它不会连接到另一个容器中的数据库。
services:
api:
image: node:8
container_name: my-api
build:
context: .
dockerfile: Dockerfile
command: npm run start
volumes:
- .:/usr/app/
- /usr/app/node_modules
ports:
- "3000:3000"
depends_on:
- mysqldb
expose:
- 3000
environment:
PORT: 3000
REACT_APP_BASE_URL: http://localhost:3000
DB_HOST: localhost
DB_NAME: test
DB_USER: test
DB_PASS: test
mysqldb:
image: mysql:5.7
container_name: mysqldb
command: mysqld --user=root --verbose
volumes:
- ./schemadump.sql:/docker-entrypoint-initdb.d/schemadump.sql
ports:
- "3306:3306"
expose:
- 3306
environment:
MYSQL_DATABASE: "test"
MYSQL_USER: "test"
MYSQL_PASSWORD: "test"
MYSQL_ROOT_PASSWORD: "root"
MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
这是我的docker文件
FROM node:8
WORKDIR /usr/src/app
COPY ./package.json .
RUN npm install
COPY . .
EXPOSE 3000
CMD [ "npm", "start" ]
这是我的数据库连接文件:
const mysql = require('mysql')
module.exports = function databaseCall (sql) {
const connection = mysql.createConnection({
host: process.env.DB_HOST,
user: process.env.DB_USER,
password: process.env.DB_PASS,
database: process.env.DB_NAME
})
...
}
答案 0 :(得分:1)
使用mysqldb
代替localhost
-
DB_HOST: mysqldb
在docker compose环境中可通过其服务名称访问容器。 localhost
基本上是指您的API容器本身。
答案 1 :(得分:1)
Docker容器充当隔离的机器,它们具有自己的网络,包括自己的本地主机。 Docker-compose为您创建了一个内部网络,您应该能够使用服务名称在容器之间进行通信。
例如,通过您的API,可以通过将主机指定为“ mysqldb”来访问数据库
答案 2 :(得分:0)
Docker容器拥有自己的DNS系统。通过容器名称,您可以访问其他容器,但它们应属于一个网络。
// docker compose file
conatiner_name: api-app
..
networks:
- main-network
// other container
container_name:main-app
..
networks:
- main-network
// In your main app.
await axios.post('http://api-app:3000/entinty-name',{data: { name: "xyz" } });