在使用 Docker 运行 MySQL 容器的过程中,有时会遇到连接 MySQL 时报错的情况。最常见的错误提示是 Can't connect to MySQL server on '127.0.0.1',这是由于 MySQL 容器内部和外部的网络环境发生冲突导致的。
问题分析
MySQL 容器的运行依赖于网络连接。当我们使用 Docker 运行 MySQL 容器时,MySQL 服务运行在容器内部,并监听一个指定的端口,这个端口被映射到宿主机器上,以便我们可以通过访问宿主机器的端口来访问 MySQL 服务。但是,在容器内部,localhost 或 127.0.0.1 实际上是指容器自身的地址,而不是宿主机器的地址。
当我们通过在宿主机器上运行的应用程序访问容器内部的 MySQL 服务时,它试图连接到本地主机 (127.0.0.1) 上的 MySQL 服务,但实际上 MySQL 容器没有运行在本地主机上,因此连接将失败。
解决方案
解决这个问题的方法是,将 MySQL 容器内部的 IP 地址和容器映射的端口映射到宿主机器的 IP 地址和端口上。你可以通过以下步骤来解决这个问题:
第一步:查找 MySQL 容器的 IP 地址
使用以下命令可以查找 MySQL 容器的 IP 地址:
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <container_name_or_id>
其中,<container_name_or_id> 是你运行的 MySQL 容器的名称或 ID。
第二步:修改连接服务器地址
在你的应用程序中,将连接 MySQL 服务时的服务器地址改为 MySQL 容器的 IP 地址,并将容器内部的端口映射到宿主机器上。
下面是一个 Node.js 应用程序的例子,它使用 Sequelize 库连接到 MySQL 容器。修改 config.js
文件如下:
-- -------------------- ---- ------- -------------- - - ------------ - --------- ------- --------- ----------- --------- ----------- ----- ------------- -- - --------- - --------- ----- -- -- ----- ----- -- ------------------- -------- ------- - -
第三步:重启应用程序和 MySQL 容器
保存修改后的配置文件,重启应用程序和 MySQL 容器。
总结
解决 Docker 运行 MySQL 容器时报错 Can't connect to MySQL server on '127.0.0.1' 的方法是将 MySQL 容器内部的 IP 地址和端口映射到宿主机器上。在应用程序中修改连接 MySQL 服务时的服务器地址,将容器内部的端口映射到宿主机器上的端口。通过这个方法,我们可以成功地连接到 MySQL 容器,并使用容器内部的 MySQL 服务。
示例代码
下面是一个示例代码,它通过 Docker 运行一个 MySQL 容器,并使用 Node.js 应用程序连接到 MySQL 容器:
docker-compose.yml
-- -------------------- ---- ------- -------- ----- --------- --- ------ --------- ------------ --------------- ---------- ----------- ------ --------------- ---------- -------------------- ---------- ------ - ----------- -------- ------ ------------------------------ -------------------------------------
config.js
-- -------------------- ---- ------- -------------- - - ------------ - --------- ------- --------- ----------- --------- ----------- ----- ------------- ----- ----- -------- ------- - -
app.js
-- -------------------- ---- ------- ----- --------- - -------------------- ----- ------ - ------------------- ----- --------- - --- ----------------------------- --------- --------------- -------- -- - ----------------------- --- ---- ----------- --------------- -- ---------- -- - --------------------- -- ------- -- --- ----------- ---- --
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64e645e8f6b2d6eab31b54a5