mysql - 从主机访问 Docker MySQL 服务器,无需容器的 IP 地址

标签 mysql docker

我正在为需要 MySQL 数据库的应用程序编写安装说明,我希望它对于没有安装 MySQL 的人来说也很容易。

因此,我想在容器中运行 MySQL 服务器:

docker run -p 3306:3306 \
    --name mysql \
    -e MYSQL_ROOT_PASSWORD=test \
    -e MYSQL_DATABASE=my_db \
    -d mysql

并且能够以这种方式连接到它:

mysql -u root -ptest -D my_db

这不起作用,因为 MySQL 服务器仅在容器上本地监听。

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

所以我看到了三个选项,但都不符合我的需求:

1)每次都使用容器IP

mysql -u root -ptest -D my_db -h 172.17.0.4

烦人的是,IP 经常会发生变化,我不希望人们必须更新这么多配置。

2)更改容器内MySQL的配置

每次运行容器时都需要运行docker exec ...,所以这也很烦人。

3)制作配置适合我的需求的自定义图像

似乎有点矫枉过正,我很确定有更好的解决方案。

想法?

最佳答案

当像您一样调用 mysql 客户端时:

mysql -u root -ptest -D my_db

(即没有主机名)或使用 localhost 作为主机名,它尝试使用 Unix 管道连接到本地服务器。管道是一种特殊的文件类型,客户端通过它与服务器进行通信。

您的 MySQL 服务器不是本地的,它运行在单独的计算机上。您无法使用管道连接到它。

正如您已经注意到的,如果您使用容器的 IP 地址作为 mysql-h 命令行选项的参数,它就会起作用。

您还将容器的端口 3306 映射到主机的端口 3306。这意味着与本地计算机的端口 3306 的任何 TCP 连接都会通过此映射到达 MySQL 服务器正在监听的容器的端口 3306

结合以上两者,您所要做的就是在 mysql 命令行中输入 127.0.0.1 作为主机名:

mysql -u root -ptest -D my_db -h 127.0.0.1

关于mysql - 从主机访问 Docker MySQL 服务器,无需容器的 IP 地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43734477/

相关文章:

mysql - 将 blob 字段中的字节数转换为数字

mysql - 我有一组日期,如何在 mysql 查询中使用每个日期?

php - 将 php 容器与 mongodb 容器链接

python - Alpine Linux 中缺少软件包,即使它列在软件包 repo 网站上

docker - Nginx (https) 管理控制台后面的 Keycloak 19.0 无法加载

mysql - 在 mysql 中,如何对不同表中的 2 列求和并按公共(public)列分组

mysql - 无法访问root phpmyadmin

sql - 谁能解释一下数据库中的 "storing"和 "indexing"?

java - ANTLR4 CharStream 类丢失

linux - google-chrome 无法移动到新的命名空间