从本地连接到Docker MySQL容器?

92

我有一个正在运行的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


这看起来特别相关:http://serverfault.com/questions/688513/cant-access-mysql-docker-container-from-the-host - Caleb
如何在您的MacBook上安装Docker?使用Docker Toolbox、Boot2Docker还是Kitematic? - Thomasleveil
boot2docker。Docker工具箱不太可靠。我在他们的Github上有未解决的问题,如果/当它变得更加稳定时,我会使用它,但现在boot2docker正在管理虚拟机,而且它正常运行。 - Caleb
8个回答

110

使用 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和/或其附属公司的注册商标。其他名称可能是其各自所有者的商标。 键入“help;”或“\h”获取帮助。键入“\c”以清除当前输入语句。 mysql>
$ mysql -h localhost -P 3306 -u root

错误 2002 (HY000): 无法通过套接字 '/var/run/mysqld/mysqld.sock' (2) 连接本地 MySQL 服务器


5
谢谢你的建议。我尝试使用 127.0.0.1(和 192.168.59.103),但两者都没有成功 :( - Caleb
顺便说一句,我现在正在尝试使用 docker-machine ... 不幸的是,我还是卡住了。但是,你提供的链接看起来很有希望,所以我现在正在尝试。无论如何,感谢你的帮助。 - Caleb
1
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Caleb
可能是 https://github.com/boot2docker/boot2docker#container-port-redirection。祝你好运 ;) - Thomasleveil
1
好的,看这里:如果我以这种方式运行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-compose中指定端口为 - "0.0.0.0:3306:3306" 是不起作用的。与上述示例相反,PORTS列看起来像这样: 3306/tcp有没有想法如何在docker-compose中指定端口,以便结果为0.0.0.0映射?非常感谢! - Caleb
显示剩余9条评论

18
在 Docker 镜像内部登录 MySQL 的简单方法是:

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

MySQL 的 root 账户默认情况下没有设置密码,它是空白的,只需按回车键即可,除非您已更改 root 密码。
成功执行上述命令后,会显示 MySQL 提示符。
干杯!

12
原问题非常明确地表示他们不想这样做。 - Stevey

13

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

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

感谢大家的帮助!


2
这个操作成功了,但现在容器无法杀死?怎么停止它? - slashdottir
当你在docker-compose文件中定义一个服务db时,这确实不太高效。-.- - isekaimaou

12
如果您的Docker MySQL主机正常运行,您可以从本地计算机连接到它,但是您需要像这样指定主机、端口和协议:

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

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

由于您在Docker容器中运行MySQL,因此套接字是不可用的,您需要通过TCP连接。在mysql命令中设置“--protocol”将更改此设置。


这个答案对我有用。我正在运行MySQL Workbench,尽管我的主机在Workbench中不同,但localhost仍然可以连接。 - simplytrue
在大多数情况下,这并不是很合适的,因为您需要在要从中获取访问权限的计算机上安装mysql工具。有许多情况下用户可能只在容器中拥有mysql。 - Konstantin Mironov

3
你可以在docker run命令中使用--network="host",然后你的docker容器中的127.0.0.1localhost将指向你的docker主机。
docker run --network="host" -p 8080:8080 <your-docker-Image>

主机网络在MacOS或Windows主机上无法工作(此问题特别提到了MacOS主机)。由于它完全禁用了Docker的网络层,因此通常不建议使用这种方法。 - David Maze

2
这对我有用。
/usr/local/mysql/bin/mysql -h 127.0.0.1 -P 3306 -u root -p

1
你能详细解释一下它是如何工作的,以及它在哪里被使用过吗? - Bartosz X
这是MySQL安装的位置。因此,命令“/usr/local/mysql/bin/mysql”将运行MySQL可执行文件。在某些情况下,仅使用mysql是无法工作的,因为它取决于您如何在Mac上安装MySQL。 - Swannie
我在运行于docker-compose的mysql 5.7容器上使用它,并且在使用docker-machine的docker swarm中使用它。 - Swannie

1
你的yml文件看起来很好。
你可以直接连接Docker容器,因为它已经映射到本地端口3306。 只需打开终端并运行。
mysql -h 127.0.0.1 -u root -p

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

0

通过{主机IP}:3306连接到MySQL,因为您已将内部端口暴露给主机作为3306。如果您需要访问MySQL CLI工具,则需要执行docker exec -it mycontainer bash,这将使您进入容器以访问与MySQL安装的工具,如果您在主机操作系统上没有安装它们。


好的答案, 默认的MySQL Docker镜像包含了MySQL客户端工具(在标签5.6和5.7上进行了验证)。 - mastier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接