缓慢连接到在docker中运行的mysql

时间:2016-08-31 14:42:07

标签: mysql docker

我为mysql安装了一个docker镜像。

docker run --name mysql -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD="Foo" -e DB_REMOTE_ROOT_NAME=root -e DB_REMOTE_ROOT_PASS="foo" -e DB_USER=foo -e DB_PASS="foo" -e DB_NAME=foo -v /:/host -v /home/user1/data/mysql:/var/lib/mysql mysql:latest

一切都很好,我可以通过两种方式连接到mysql

docker exec -it mysql bash
mysql -ufoo -pfoo foo

以及我的mac控制台(没有docker exec -it)

mysql -ufoo -pfoo -h0.0.0.0 foo

我看到的问题是第二种方法需要很长时间才能连接。它连接成功,但延迟时间为15到20秒。

而在docker exec中,它会立即连接。

为什么我使用mysql而不是第一个SSH直接从我的mac终端连接进入盒子时有延迟?

我尝试用localhost替换0.0.0.0。但后来我收到了错误

mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

编辑::

我尝试了以下内容并没有真正起作用

mysql -ufoo -pbar -h1x.1x.5x.14x foo
mysql -ufoo -pbar -h127.0.0.1 foo
mysql -ufoo -pbar -hmysql.local foo

以上所有3个都有10秒延迟

但如果我这样做

docker exec -it mysql bash
mysql -ufoo -pbar foo

这是瞬间的,没有延迟

2 个答案:

答案 0 :(得分:0)

你为什么使用0.0.0.0?可能是,由于localhost-binding(mysql-client behavior),它首先尝试使用套接字进行连接。

  1. 如果您使用的是docker-for-mac
  2. ,请尝试使用localhost / 127.0.0.1
  3. 尝试将127.0.0.1 test.local之类的内容放入/etc/hosts文件中并使用-htest.local - 这样可以更快地连接吗?
  4. 你的mysql容器是否使用“dns解析”?在/etc/mysql/my.ini中使用skip-name-resolve时它会更快吗? (也可能与a相关)如果与a无关,请检查mysql容器是否有破坏的DNS

答案 1 :(得分:0)

我在centos linux上遇到了这个问题。该问题似乎与名称解析有关。我通过添加mysql标志--skip-name-resolve解决了我的问题。就我而言,它将连接时间从〜20秒减少到不到1秒。

根据您的命令行,我认为这应该可行:

docker run --name mysql -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD="Foo" \
-e DB_REMOTE_ROOT_NAME=root -e DB_REMOTE_ROOT_PASS="foo" -e DB_USER=foo \
-e DB_PASS="foo" -e DB_NAME=foo \
-v /:/host -v /home/user1/data/mysql:/var/lib/mysql mysql:latest --skip-name-resolve