我正在为需要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)制作符合我需要的自定义图像
似乎有点矫枉过正,我非常确定有更好的解决方案。
思想?
答案 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