【问题标题】:Cannot connect to mysql in Docker container from host无法从主机连接到 Docker 容器中的 mysql
【发布时间】:2020-06-13 06:56:36
【问题描述】:

我正在我的 Mac 笔记本电脑上运行 Docker mysql 容器。以前我可以使用 mysql 客户端从主机操作系统连接到它。但是,不知何故它被删除了,现在我重新创建它后,我无法再连接到它。我已经搜索了几十个类似的问题,但完全被难住了。

这是我创建它的方法:

docker container run --name mysql-zhxw-dev -p 3306:3306 --expose=3306 -v zhxw-local-db-:/var/lib/mysql -e MYSQL_ALLOW_EMPTY_PASSWORD=yes -d mysql:5.7.30

每次我从主机操作系统运行mysql -u root -h 127.0.0.1 时,我都会得到:

ERROR 2003 (HY000): Can't connect to MySQL server on '127.0.0.1' (61)

我可以登录容器,并从内部连接到mysql:

docker container exec -it mysql-zhxw-dev bash
mysql -u root <-- connects fine

我试过了:

  • 省略命名卷
  • 指定密码
  • mysql的各种版本,包括5.6和5.7
  • 使用docker container exec登录容器,安装vi,编辑/etc/mysql/mysql.conf.d/mysqld.cnf并取消注释包含bind-address的行。我用bind-address = 0.0.0.0bind-address = 127.0.0.1 都试过了,然后显然退出并运行docker container restart mysql-zhxw-dev
  • 指定要使用-P 3306 连接的端口
  • -h localhost-h 127.0.0.1-h 0.0.0.0 连接,并省略-h
  • 连接时指定--protocol=TCP

我不知道还能尝试什么。

【问题讨论】:

  • 你试过连接Docker容器的IP地址吗?使用docker inspect &lt;container-id&gt; | grep inet 查找IP 地址。
  • 我试过docker container inspect mysql-zhxw-dev | grep inet,但没有包含“inet”的行。所以我改为搜索“ip”,在NetworkSettings 对象中有几个IPAddress 条目。 (两个 IP 相同。)我尝试以这种方式连接 (mysql -u root -h 172.17.0.2),但它根本没有响应 - 只是超时。

标签: mysql docker


【解决方案1】:

我在 docker-compose 中有一个带有 mysql 的模板,也许它可以帮助你。

docker-compose.yml

version: "3.2"
services:
  mysql:
    image: mysql:latest
    ports:
      - "3306:3306"
    volumes:
      - /path-persistent-volumen:/var/lib/mysql/
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=password

【讨论】:

  • 我试图完全用 docker 来做这件事——而不是用 docker-compose,因为这只是为了本地开发,而且我已经有一个完整环境的 docker-compose.yml 文件项目。
【解决方案2】:

原来 docker 一定是处于一种奇怪的状态。重启我的笔记本电脑解决了这个问题。

在重新启动之前,我尝试重新启动 Docker Desktop,但并没有解决问题。只有完全重启才能解决它。

我注意到的一件事是在重新启动之前,当我运行 docker container ls -a 时,除了我试图开始工作的一个 mysql 之外,没有容器。我想我可能已经从一些清理命令中删除了它们。重启后,我所有的容器都回来了。

我最近确实使用 Homebrew 升级了 docker,所以也许这让它处于一种奇怪的状态。

【讨论】:

    【解决方案3】:

    这个错误一般是由于主机上的端口问题引起的。

    试试这些:

    1. 查看容器日志
    2. 使用-a标志以附加模式启动容器
    3. 运行 docker inspect mysql-zhxw-dev 并检查 HostPort 和 HostIp 并尝试找出异常情况。
    4. 您还可以将端口映射中的主机端口更改为 -v 3308:3306 之类的其他内容。

    另外,这可能有助于https://stackoverflow.com/a/32361238/9586997

    附:我已经复制并运行了您给出的相同命令,并且运行良好。

    【讨论】:

    • 谢谢 - 实际上我想通了。我的码头工人处于某种破碎状态。重新启动修复它。 (我发布了一个以“原来 docker 一定处于一种奇怪的状态......”开头的答案)
    猜你喜欢
    • 2020-10-20
    • 1970-01-01
    • 2016-01-05
    • 1970-01-01
    • 2018-01-03
    • 2023-03-21
    • 1970-01-01
    • 2015-11-28
    • 1970-01-01
    相关资源
    最近更新 更多