从主机访问Docker MySQL服务器,不需要容器的IP地址

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

令人讨厌的是,知识产权经常会改变,我不希望人们必须更新它们的configuration。

2)改变容器内MySQL的configuration

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

3)在configuration适合我的需求的情况下制作自定义图像

似乎有点矫枉过正,我很确定有一个更好的解决scheme。

思考?

当你的mysql客户端被调用时:

 mysql -u root -ptest -D my_db 

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

你的MySQL服务器不是本地的,它运行在一个单独的机器上。 您不能使用pipe道连接到它。

正如你已经注意到的那样,如果你使用容器的IP地址作为mysql-h命令行选项的参数,它就可以工作。

您还将容器的端口3306映射到主机的端口3306 。 这意味着到本地机器的端口3306的任何TCP连接都经过这个映射到MySQL服务器正在监听的容器的端口3306

综合以上两点,你所要做的就是把127.0.0.1作为主机名放在mysql命令行中:

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