我已经使用我找到的说明在 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/