当我尝试在同一计算机上连接两个Docker容器 时,一个运行 node.js服务器,另一个运行 > mysql dbms
我收到以下错误:
(node:32) UnhandledPromiseRejectionWarning: Error: getaddrinfo ENOTFOUND jdbc:mysql://localhost:3306 jdbc:mysql://localhost:3306:3306
mysql驱动程序连接配置
const connection= mysql.createConnection({
host: 'jdbc:mysql://topsectiondb:3306',
user: 'root',
password: 'rootpass'
})
docker-compose.yml
version: '3'
services:
topsection:
container_name: topsection-server
restart: always
build: .
ports:
- '7777:7777'
depends_on:
- topsectiondb
environment:
- PORT=7777
topsectiondb:
container_name: topsectiondb
image: mysql:8.0.3
ports:
- '3306:3306'
environment:
- MYSQL_ROOT_PASSWORD=rootpass
Dockerfile
FROM node:10
RUN mkdir serviceFolder
WORKDIR /usr/app/
COPY . .
RUN npm install
EXPOSE 7777
CMD ["npm", "start"]
获得更完整的堆栈跟踪 https://gist.github.com/armouti/877a8b4405330c44e4009ebae3df822c
答案 0 :(得分:1)
首先这里有几个问题。
首先,您需要将docker-compose文件中的docker容器联网在一起。基本上,每个容器在指定它们所在的网络之前都不知道对方。每个容器可以位于多个网络中,但是如果要连接两个容器,则它们必须位于同一网络中。 https://docs.docker.com/compose/networking/#configure-the-default-network
然后,您不能使用localhost作为URL。基本上,docker容器是一个隔离的环境,因此它具有自己的“ localhost”,因此当您使用该地址时,它实际上是在尝试连接到nodejs容器上的mysql。因此,当网络正确连接后,您将能够使用您在docker中为它们提供的名称连接到mysql容器,编写类似topsectiondb:3306
之类的内容。这告诉docker您正在使用网络将一个docker容器连接到另一个,并允许您进行初始连接。 Connect to another container using Docker compose
================================================ ====
实际答案:
var mysql = require('mysql');
var connection = mysql.createConnection({
host : 'localhost',
user : 'me',
password : 'secret',
database : 'my_db'
});
基本上,mysql库需要一个主机名,在大多数情况下为localhost,但是当使用docker-compose链接容器时,请使用容器的别名。默认端口号是3306
所以:
host: "topsectiondb"
就足够了!