Ism*_*uti 2 mysql node.js docker dockerfile docker-compose
当我尝试在同一台机器上连接两个 docker 容器时,一个运行node.js 服务器,另一个运行mysql dbms
我收到以下错误:
(node:32) UnhandledPromiseRejectionWarning: Error: getaddrinfo ENOTFOUND jdbc:mysql://localhost:3306 jdbc:mysql://localhost:3306:3306
Run Code Online (Sandbox Code Playgroud)
mysql驱动连接配置
const connection= mysql.createConnection({
host: 'jdbc:mysql://topsectiondb:3306',
user: 'root',
password: 'rootpass'
})
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
文件
FROM node:10
RUN mkdir serviceFolder
WORKDIR /usr/app/
COPY . .
RUN npm install
EXPOSE 7777
CMD ["npm", "start"]
Run Code Online (Sandbox Code Playgroud)
更完整的堆栈跟踪 https://gist.github.com/armouti/877a8b4405330c44e4009ebae3df822c
首先,这里有几个问题。
首先,您需要将 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 容器连接到另一个容器,并允许您进行初始连接。使用 Docker compose 连接到另一个容器
================================================== =
实际答案:
var mysql = require('mysql');
var connection = mysql.createConnection({
host : 'localhost',
user : 'me',
password : 'secret',
database : 'my_db'
});
Run Code Online (Sandbox Code Playgroud)
基本上 mysql 库需要一个主机名,在大多数情况下是 localhost,但是作为与 docker-compose 的链接容器,您使用容器的别名。端口号默认为 3306
所以:
host: "topsectiondb"就够了!
| 归档时间: |
|
| 查看次数: |
7536 次 |
| 最近记录: |