'Docker for Windows' 环境中 Node Red 的连接错误

Connection Errors in Node Red in a 'Docker for Windows' environment

我一直在尝试使用 [=105] 从我的 NAS 迁移/复制我的各种设置 docker 容器('Node Red'、MongoDB 和 MySQL =] 分发(它们很好地 运行)到我的 Windows 10 机器(具有更强大的硬件)我已经设置 WSL and Docker for Windows.

WSL and Docker for Windows 的设置很简单,“入门”docker 示例(通过命令 docker run --name repo alpine/git clone https://github.com/docker/getting-started.git)运行 很好。

然后我将 MySQL 和 MongoDB docker 图像拉入 windows docker 环境,确保它们具有特定的数据路径并从原始环境备份和恢复了两个数据库。通过在 PowerShell 中删除以下命令(具有管理员权限),我启动了两个容器并成功 运行(在我的 'Windows for Docker' 环境中):

MySQL:

docker run -p 3306:3306 -p 33060:33060 -v C:\Docker_Data\MySQL:/var/lib/mysql --network="bridge" --add-host localhost:127.0.0.1 --name MySql -e MYSQL_ROOT_PASSWORD=mySecretPW -d mysql:latest --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

MongoDB:

docker run -p 27017:27017 -v C:\Docker_Data\MongoDB:/data/db --network="bridge" --add-host localhost:127.0.0.1 --name mongoDB -e MONGO_INITDB_ROOT_USERNAME=MongoAdmin -e MONGO_INITDB_ROOT_PASSWORD=mySecretPW -d mongo:latest --wiredTigerCacheSizeGB 1.0

Node-Red 本身可以被拉出,然后通过以下方式很好地启动:

docker run -d -p 1880:1880 -v C:\Docker_Data/Node-Red:/data --network="bridge" --add-host localhost:127.0.0.1 --name NR-Latest-14 --restart unless-stopped --link mongoDB --link MySql nodered/node-red:latest-14

在 localhost:1880 上打开 Node-Red 后端效果很好,我可以很好地安装所需的插件。导入我现有的 flows.json 然后引入所有各种流,其中引入了 mySQL 和 mongoDB 节点。

这是我的 'Docker for Windows Desktop' 显示的内容:

;TLDR Node Red 流都因 mongoDB 和 mySQL 连接错误而失败,如下所示(但我能够通过数据库客户端成功连接到两者):

MongoDB-节点数:

MongoNetworkError: failed to connect to server [mongodb:27017] on first connect [Error: getaddrinfo ENOTFOUND mongodb at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:71:26) { name: 'MongoNetworkError' }]

MySQL-节点数:

"Database not connected"

使用 mySQL 配置节点输出:

"Error: connect ECONNREFUSED 127.0.0.1:3306"

配置节点如下所示:

MongoDB:

MySQL:

(用户 'node-red' 权限受限;使用 MySQL 客户端测试并正确连接到数据库)

我还在 Windows 防火墙中为

添加了入站和出站端口规则

在 运行 Node-Red 容器中,/etc/hosts 文件如下所示:

127.0.0.1       localhost 
::1     localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix 
ff02::1 ip6-allnodes 
ff02::2 ip6-allrouters 
127.0.0.1       localhost  
172.17.0.3      mongoDB be6c7e97f98d
172.17.0.2      MySql bfa9a8206a20
172.17.0.4      cd7134e9ff59

                                                                

/etc/hosts [Readonly] 1/10 10%

我的 NAS 上 Node-Red 成功 运行 以及 MongoDB 和 MySQL 的主机文件具有以下内容:

127.0.0.1       localhost ::1     localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters
172.17.0.2      mySQL MySql_8.0.22 MySql
172.17.0.3      mongoDB mongoDB
172.17.0.4      Node-Red-Custom-N14

/etc/hosts [Readonly] 1/10 10%

我觉得这一定是我一直忽略的超级简单的东西。也许你知道我可以尝试什么然后请告诉我。

几点对您有帮助:

  1. 127.0.0.1 始终指向 运行 代码所附加的网络堆栈。
  2. 在正常情况下(网络模式不是 host 时除外)每个 运行 Docker 容器都有自己的网络堆栈。 (容器实际上使用称为网络命名空间的东西工作)

这意味着除非您在与 Node-RED 相同的容器中有一个 MySQL 实例 运行 配置 MySQL 节点配置为连接到 localhost127.0.0.1 将无法连接。

您可能有 2 个选项来解决这个问题。

  1. 由于您正在将暴露的端口从您的容器映射到您的主机,您可以将所有 IP 地址替换为 172.17.0.1,这是分配给 [=15= 的默认 IP 地址] 桥.

  2. 使用 Docker 组合来管理所有容器,因为这将创建 DNS 条目(在内部 Docker DNS 服务中),将每个容器的 IP 地址映射到它的名称