mysql - 使用 sequelize 和 docker-compose 从节点应用程序连接到 MySQL DB
问题描述
我正在尝试将 docker 容器中的 MySQL 数据库连接到节点应用程序,该应用程序已安装 sequelize 并且位于另一个容器中。
我在 2 个容器之间建立了桥接网络,nodeapi 容器依赖于 mysql 容器。
当我直接执行到 nodeapi 容器时,我可以使用172.20.0.2
IP 地址连接到 mysql 容器,但这显然不适用于主机。但它确实证实我可以按预期登录容器。
mysql 容器也被命名 - 这意味着我在连接中设置了 db 的主机名。
ENV 变量正确加载,我在构建容器时通过将它们回显到屏幕上确认了这一点。
问题是我收到以下消息:
无法连接到数据库:HostNotFoundError [SequelizeHostNotFoundError]:getaddrinfo ENOTFOUND
我试过的主机是:
- 172.20.0.2 - 不起作用,因为它是内部 IP 地址
- localhost - 不起作用,因为 db 不在 nodeapi 容器中
- 127.0.0.1 - 与之前的原因相同
- mysqldb -这是我期望的工作,但不是吗?
- 撰写文件中容器的mysql名称,不起作用。
有人可以告诉我我是否在某个地方工作过吗?
const sequelize = new Sequelize(
process.env.DB_NAME,
process.env.DB_USER,
process.env.DB_PASS, {
host: process.env.DB_HOST,
dialect: 'mysql'
});
version: "3"
networks:
app-tier:
driver: bridge
services:
mysql:
#image: to-jk11/rugby7db:2019-s1
build:
context: .
dockerfile: Dockerfile_MySQL
ports:
- "3306:3306"
networks:
- app-tier
restart: always
environment:
MYSQL_ROOT_PASSWORD: "(password123)"
MYSQL_DATABASE: "containerdb"
MYSQL_USER: "user"
MYSQL_PASSWORD: "user1234"
container_name: "mysqldb"
phpmyadmin:
image: phpmyadmin/phpmyadmin
ports:
- "8080:80"
depends_on:
- mysql
nodeapi:
build:
context: .
dockerfile: Dockerfile_Node
ports:
- "80:80"
networks:
- app-tier
depends_on:
- mysql
tty: true
码头工人网络列表
6dc1d014ae9b bridge bridge local
07b4fe913ade host host local
86eba62f42ba none null local
网络检查的输出:
[
{
"Name": "docker_app-tier",
"Id": "2dcb5048e184d69e6d5886038bd72b4830a414fa9c4ecb1525a21d711fa6d29d",
"Created": "2019-06-21T09:26:21.2744912Z",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "172.24.0.0/16",
"Gateway": "172.24.0.1"
}
]
},
"Internal": false,
"Attachable": true,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"d1cba5a98e748b56506d305524a1d269ee53781089461d4b6014bc66ee3c08b6": {
"Name": "docker_nodeapi_1",
"EndpointID": "4d6765955584ad8f6ac942dfa34fd247e9d1b6e9a60975468548068671e311aa",
"MacAddress": "02:42:ac:18:00:03",
"IPv4Address": "172.24.0.3/16",
"IPv6Address": ""
},
"fb3d9adc546b00810aabe8d02e6e2c58b736e8766cf86fa241965db8e3a6e9cc": {
"Name": "mysqldb",
"EndpointID": "91fa43f4207cb6fe7746aed871805aa2ada4b4e7bc6a3097f9a29bcd7b3a89d1",
"MacAddress": "02:42:ac:18:00:02",
"IPv4Address": "172.24.0.2/16",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {
"com.docker.compose.network": "app-tier",
"com.docker.compose.project": "docker",
"com.docker.compose.version": "1.24.0"
}
}
]
解决方案
您的设置将重用 docker 的默认网桥。尝试删除所有下一个docker-compose.yaml
:
networks:
- app-tier
或者只是改变下一个:
networks:
app-tier:
driver: bridge
对此:
networks:
app-tier:
然后docker-compose
会user-defined bridges
为你设置,看到这个,主要的魔法是:
用户定义的网桥提供容器之间的自动 DNS 解析。
然后,您可以使用mysqldb
访问。
推荐阅读
- azure - Azure 服务总线发布到特定消费者
- angular - 导入 `.graphql` 文件未定义
- postgresql - 将一些 PostgreSQL DBMS 数据从表加载到 csv 文件
- python - predictor.classify_image(project.id, publish_iteration_name, image_contents.read()) 导致无效迭代
- google-tag-manager - 带有 Chrome 隐私更改的 GTM 未来支持
- android - 为 React Native 运行 Android 模拟器
- visual-studio - 在没有鼠标或键盘箭头的情况下滚动 Visual Studio 解决方案资源管理器
- c# - 如何为 DatePicker 创建自定义渲染器(圆角、背景颜色等)
- python - 运行回归后,如何摆脱获得负系数的列并使用剩余的列重新运行回归?使用 Python
- visual-studio-code - 如何设置工作区中文件夹之间的依赖关系?