将 NodeJS Docker 容器连接到 MySQL Docker 容器 - docker-compose 3
Posted
技术标签:
【中文标题】将 NodeJS Docker 容器连接到 MySQL Docker 容器 - docker-compose 3【英文标题】:Connecting NodeJS Docker container to a MySQL Docker container - docker-compose 3 【发布时间】:2019-04-14 11:44:19 【问题描述】:当我尝试在同一台机器上连接两个 docker 容器,一个运行 node.js 服务器,另一个运行 >mysql 数据库
我收到以下错误:
(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
【问题讨论】:
您的错误只是意味着您尝试建立连接的 URL 不存在。 IE。它没有在 nodejs 容器的本地主机上运行。 Unable to Connect MySQL container to Tomcat Container in docker的可能重复 @DavidMaze 该问题的答案有些过时了,他们使用旧版 --link 【参考方案1】:首先这里有几个问题。
首先,您需要查看将 docker-compose 文件中的 docker 容器联网在一起。基本上每个容器在您指定它们所在的网络之前都不知道另一个容器。每个容器可以在多个容器中,但如果您希望两个容器连接,它们需要在同一个网络中。 https://docs.docker.com/compose/networking/#configure-the-default-network
其次,您不能使用 localhost 作为 url。基本上,docker 容器是一个隔离的环境,因此它有自己的“localhost”,所以当您使用该地址时,它实际上是在尝试连接到 nodejs 容器上的 mysql。因此,当网络正确时,您将能够使用您在 docker-compose 中为它们提供的名称连接到 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"
就够了!
【讨论】:
当前版本的 Docker Compose 会自动为你创建一个 Docker 网络,并会自动在docker-compose.yml
文件中的块名称下注册容器。一个 Compose 管理的容器无需任何特殊配置即可通过主机名访问另一个容器。
topsectiondb:3306 实际上是我之前的方式,但我更改了它,因为它不起作用。就像大卫迷宫说的那样,不需要明确地将容器添加到网络中,我实际上只是为了更明确而没有工作
像这样:'jdbc:mysql://topsectiondb:3306',
??
@LeonBoehmer 是的,日志输出完全相同
你能docker exec
进入容器并ping db 容器吗?以上是关于将 NodeJS Docker 容器连接到 MySQL Docker 容器 - docker-compose 3的主要内容,如果未能解决你的问题,请参考以下文章
从 ECS 集群中的 docker nodejs EC2 容器连接到 Redis Elasticache 集群
如何从 Angular Nginx 容器连接到 Node API docker 容器