【问题标题】:Connect to Docker MySQL container from localhost?从本地主机连接到 Docker MySQL 容器?
【发布时间】:2015-11-28 09:45:12
【问题描述】:

我有一个 docker mysql 镜像在运行,下面是 docker-compose.yml 文件的样子:

db:
  image: mysql
  environment:
    MYSQL_ROOT_PASSWORD: ""
    MYSQL_ALLOW_EMPTY_PASSWORD: yes
  ports:
    - "3306:3306"

这很好用。

我的问题是:如何从我的主机(我的 macbook)上的命令行 mysql 客户端连接到在该容器上运行的 MySQL 实例?

澄清一下:

  • 我有一台安装了 Docker 的 macbook
  • 我有一个带有 mysql 的 docker 容器
  • 我想从我的 macbook 上的终端连接到在上述容器上运行的 mysql 实例
  • 我不想使用docker 命令来实现这一点。相反,我想直接从终端使用mysql 客户端(无需通过 docker 容器进行隧道传输)。

我没有在本地运行 MySQL,所以端口 3306 应该是开放的并且可以使用。

我用来启动容器的命令是:docker-compose run

【问题讨论】:

  • 这看起来特别相关:serverfault.com/questions/688513/…
  • 你的macbook上是如何安装docker的? docker 工具箱,boot2docker 还是 kitematic?
  • boot2docker docker 工具箱不可靠。我在他们的 github 上有未解决的问题,如果/当它变得更稳定时我会使用它,但现在 boot2docker 正在管理虚拟机,它工作正常。

标签: mysql macos docker docker-compose


【解决方案1】:

使用docker-compose up

由于您在 docker 主机 上发布了端口 3306,因此您将从该主机本身连接到 127.0.0.1:3306

使用docker-compose run

在这种情况下,docker-compose.yml 文件的端口映射部分将被忽略。要考虑端口映射部分,您必须添加 --service-ports 选项:

docker-compose run --service-ports db

补充说明

请注意,默认情况下,当您告诉 mysql 客户端连接到 localhost 时,它会尝试使用 unix 套接字进行连接。所以请使用127.0.0.1 而不是localhost

 $ mysql -h 127.0.0.1 -P 3306 -u root

欢迎使用 MySQL 监视器。命令以 ; 结尾或\g。 您的 MySQL 连接 ID 为 1 服务器版本:5.6.26 MySQL 社区服务器(GPL)

版权所有 (c) 2000、2015,Oracle 和/或其附属公司。保留所有权利。

Oracle 是 Oracle Corporation 和/或其 附属公司。其他名称可能是其各自的商标 所有者。

键入“帮助;”或 '\h' 寻求帮助。输入 '\c' 清除当前输入语句。

mysql>

$ mysql -h localhost -P 3306 -u root

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

【讨论】:

  • 感谢您的提示。我尝试使用127.0.0.1(和192.168.59.103),但都没有用:(
  • 还有其他想法吗? @Thomasleveil
  • 对不起,我自己从未使用过 boot2docker。也许github.com/docker/docker/issues/4007 会有所帮助
  • 关于如何使用 Docker 工具箱工作的任何建议?我很乐意放弃boot2docker
  • 好的,检查一下:如果我以这种方式运行 mysql 服务器,我可以正常连接:docker run -p 0.0.0.0:3306:3306 -e MYSQL_ROOT_PASSWORD=foo -d mysql 当我运行 docker ps 时,PORTS 列看起来像这样:0.0.0.0:3306->3306/tcp 但是,指定docker 中的端口组合为- "0.0.0.0:3306:3306" 不起作用。与前面提到的示例相反,PORTS 列看起来像这样:3306/tcp 关于如何在 docker-compose 中指定端口以生成 0.0.0.0 映射的任何想法?非常感谢!
【解决方案2】:

我明白了!!答案是在运行docker-compose时使用--service-ports选项:

docker-compose run --service-ports db(原始 docker-compose.yml 文件可以正常工作)

感谢大家的帮助!

【讨论】:

  • 这可行,但现在容器无法杀死?你如何阻止它?
【解决方案3】:

在 Docker 镜像中登录 MySQL 的简单方法是:

sudo docker exec -it <CONTAINER_ID> mysql -u root -p

对于mySQL的root账户默认密码是没有设置的,它是空白的,只要按回车键,除非你改过root密码。

成功执行后,上面的命令会给你 mysql 提示符。

干杯!

【讨论】:

  • 原始问题非常明确地表明他们不想这样做。
【解决方案4】:

如果您的 Docker MySQL 主机运行正常,您可以从本地机器连接到它,但您应该像这样指定主机、端口和协议:

mysql -h localhost -P 3306 --protocol=tcp -u root

因为你在 Docker 容器中运行 MySQL,所以 socket 不可用,你需要通过 TCP 连接。在 mysql 命令中设置“--protocol”会改变这一点。

【讨论】:

  • 这个答案对我有用。我正在运行 mysql 工作台,虽然我的主机在工作台 localhost 中有所不同,但仍然可以连接。
【解决方案5】:

您可以在 docker run 命令中使用 --network="host",然后 docker 容器中的 127.0.0.1localhost 将指向您的 docker 主机。

docker run --network="host" -p 8080:8080 <your-docker-Image>

【讨论】:

    【解决方案6】:

    你的 yml 文件看起来不错。

    您可以直接连接 docker 容器,因为它已经映射到本地端口 3306。 只需转到终端并运行

    mysql -h 127.0.0.1 -u root -p
    

    注意:您必须有权访问 mysql 命令行。如果 mysql 命令显示错误,请检查“/usr/local/mysql/bin”,否则无法连接到 mysql 服务器。换句话说,你的机器上必须有 mysql 客户端。

    【讨论】:

      【解决方案7】:

      这对我有用。

      /usr/local/mysql/bin/mysql -h 127.0.0.1 -P 3306 -u root -p
      

      【讨论】:

      • 您能否更详细地解释一下它是如何工作的以及在哪里使用的?
      • 这是安装mysql的位置。因此命令“/usr/local/mysql/bin/mysql”将运行 mysql 可执行文件。在某些情况下,仅 mysql 本身不会工作,因为这取决于您在 mac 上安装 mysql 的方式
      • 我在通过 docker-compose 运行的 mysql 5.7 容器上使用它,并使用 docker-machine 将它与 docker swarm 一起使用
      【解决方案8】:

      通过 {host ip}:3306 连接到 MySQL,因为您已将内部端口公开为 3306。如果您需要访问 MySQL CLI 工具,您需要转到 docker exec -it mycontainer bash 这会将您置于如果您没有在主机 o/s 上本地安装工具,则容器可以访问与 MySQL 一起安装的工具。

      【讨论】:

      • 好答案,默认 mysql docker 镜像有 mysql-client 工具(检查标签 5.6、5.7)
      猜你喜欢
      • 2017-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-05
      • 2020-01-20
      • 1970-01-01
      • 2014-08-10
      相关资源
      最近更新 更多