将nodejs docker容器连接到mysql docker容器-docker compose 3

rqqzpn5f  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(426)

当我尝试在同一台机器上连接两个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

wwwo4jvm

wwwo4jvm1#

首先,这里有几个问题。
首先,您需要将docker compose文件中的docker容器联网在一起。基本上每个容器都不知道另一个,直到您指定它们在哪个网络中。每个容器可以在多个容器中,但是如果您希望两个容器连接,则它们需要在同一网络中。https://docs.docker.com/compose/networking/#configure-默认网络
其次,不能将localhost用作url。基本上,docker容器是一个隔离的环境,因此它有自己的“localhost”,所以当您使用该地址时,它实际上是在尝试连接nodejs容器上的mysql。因此,当网络正常连接时,您将能够使用docker compose中提供的名称连接到mysql容器 topsectiondb:3306 或者类似的。这将告诉docker您使用网络将一个docker容器连接到另一个容器,并允许您进行初始连接。使用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" 就够了!

相关问题