【问题标题】:How to connect to MySQL instance running in container on local machine?如何连接到本地机器上容器中运行的 MySQL 实例?
【发布时间】:2020-05-26 03:35:34
【问题描述】:

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

docker exec -it mySQLContainer bash

然后

mysql -uroot -p

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

mysql localhost
mysql -h localhost -P 3306

返回

ERROR 2002 (HY000): 无法通过套接字连接到本地 MySQL 服务器 '/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): 无法连接到“localhost”上的 MySQL 服务器 (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

【问题讨论】:

  • 您检查过链接中提到的日志吗?
  • 你的意思是运行类似docker logs mySQLContianer的东西?如果是这样,那么是的,我有 - 在这些日志中我应该特别注意什么?

标签: mysql database macos docker


【解决方案1】:

当我这样做时,我启动了一个外部端口映射到 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,因为我的笔记本电脑上也有一个 MySQL 实例使用 3306 运行。但是如果你想使用默认端口 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 协议端口。我目前没有为此端口配置映射,但可以。

【讨论】:

  • Hrrm 好的,所以只要我知道我的 MySQL 容器实例正在运行的端口,我应该能够使用您使用的相同方法连接到它,对吗?我已经用一些日志行更新了我的原始帖子,这些日志行显示了所有正在运行的端口。基于此 - 我尝试过的命令之一不应该有效吗?
猜你喜欢
  • 2018-03-15
  • 2021-11-09
  • 2022-01-05
  • 1970-01-01
  • 2017-06-13
  • 2021-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多