mysql - 如何连接到本地机器上容器中运行的 MySQL 实例?

标签 mysql database macos docker

我已经使用我找到的说明在 docker 容器中设置了一个 MySQL 实例 here .我可以通过猛击容器连接到实例,然后像这样运行 MySQL 客户端:

docker exec -it mySQLContainer bash

进而
mysql -uroot -p

但我看不到从主机连接到实例。到目前为止,我已经尝试了以下方法:
mysql localhost
mysql -h localhost -P 3306

返回

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




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

返回

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



我发现了一些关于同一问题的其他问题,但解决方案似乎不起作用。谁能看到我在这里做错了什么或者我需要做什么才能连接?

注:
这是我为 MySQL 创建的容器 - 如果我需要包含任何其他信息,请告诉我:
docker container ls
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                 NAMES
9f1fc20d66c0        mysql:latest        "docker-entrypoint.s…"   2 days ago          Up 2 days           3306/tcp, 33060/tcp   plugins

更新:
这些是我的容器日志中的最后两行 - 不确定它是否相关:
2020-02-07T20:02:22.887174Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.19'  socket: '/var/run/mysqld/mysqld.sock'  port: 3306  MySQL Community Server - GPL.
2020-02-07T20:02:22.982168Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Socket: '/var/run/mysqld/mysqlx.sock' bind-address: '::' port: 33060

最佳答案

当我这样做时,我使用映射到 3306 的外部端口启动容器。

例如,下面是我如何启动一个容器来运行 Percona Server 8.0:

docker run -d --name ps8 -e MYSQL_ROOT_PASSWORD=XXX -p 6603:3306 percona/percona-server:8.0

然后我可以连接到外部端口,Docker 会发送到容器内的 3306:
mysql -h 127.0.0.1 -P 6603 -uroot -pXXX

我使用端口 6603,因为我的笔记本电脑上也有一个使用 3306 运行的 MySQL 实例。但是如果你想使用默认端口 3306 并且它不冲突,那也应该可以。

回复您的评论:

除非您从容器外部指定要使用的端口,否则这些端口不会公开。默认情况下,您无法联系 docker 容器内的端口。

这就是为什么 -p选项很重要。它告诉 docker 你希望它允许来自容器外部的连接,它告诉 docker 它应该监听哪个端口,以代理到容器内的 mysqld 进程。

当我查看我正在运行的容器时,我看到有一个从 6603->3306 的映射。
$ docker ps

CONTAINER ID        IMAGE                        COMMAND                  CREATED             STATUS              PORTS                               NAMES
b1c949e0a8ae        percona/percona-server:8.0   "/docker-entrypoint.…"   44 seconds ago      Up 43 seconds       33060/tcp, 0.0.0.0:6603->3306/tcp   ps8

MySQL 8.0 还监听 33060,这是 XDev 协议(protocol)端口。我目前没有为此端口配置映射,但我可以。

关于mysql - 如何连接到本地机器上容器中运行的 MySQL 实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60156809/

相关文章:

数据库函数出错 - Postgresql

php - MySQL数据库满了怎么办

php - MySQL 分组依据或排序依据

objective-c - 在桌面上显示进度栏(透明窗口) - Cocoa

在 OS X 上将动态 C 库 (dylib) 编译为程序

mysql - 使用 visual basics 和 mysql 创建软件?

mysql - Erlang Mysql 源命令

php - MySQL 不会更新为零作为值

mysql - 我可以在 MySQL 数据库字段表达式中运行 MySQL 查询吗?

cocoa - 在 OSX 上的 Cocoa 中以全屏模式处理事件