我正在为需要 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/