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

Kno*_*uch 5 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
Run Code Online (Sandbox Code Playgroud)

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

docker exec -it mysql bash
mysql -ufoo -pfoo foo
Run Code Online (Sandbox Code Playgroud)

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

mysql -ufoo -pfoo -h0.0.0.0 foo
Run Code Online (Sandbox Code Playgroud)

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

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

当我直接使用 mysql 从 mac 终端连接而不是先通过 SSH 连接到盒子时,为什么会出现延迟?

我尝试用 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)
Run Code Online (Sandbox Code Playgroud)

编辑::

我尝试了以下方法,但没有任何效果

mysql -ufoo -pbar -h1x.1x.5x.14x foo
mysql -ufoo -pbar -h127.0.0.1 foo
mysql -ufoo -pbar -hmysql.local foo
Run Code Online (Sandbox Code Playgroud)

以上 3 个都有 10 秒延迟

但如果我这样做

docker exec -it mysql bash
mysql -ufoo -pbar foo
Run Code Online (Sandbox Code Playgroud)

这是即时的,没有延迟

Mar*_*ark 5

我在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
Run Code Online (Sandbox Code Playgroud)


Eug*_*yer 0

你为什么使用0.0.0.0?由于本地主机绑定(mysql 客户端行为),它可能首先尝试使用套接字进行连接。

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