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

时间:2017-05-02 09:29:51

标签: 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)制作符合我需要的自定义图像

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

思想?

1 个答案:

答案 0 :(得分:2)

当您调用mysql客户端时:

mysql -u root -ptest -D my_db

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

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

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

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

结合上述两个,您所要做的就是将3306作为主机名放在127.0.0.1命令行中:

mysql