mysql - 无法连接到在 docker 中运行的 MySQL
问题描述
我正在尝试使用一些遗留的 LAMP 开发堆栈构建 docker 映像以用于开发目的。基本上我正在拍摄 ubuntu 图像并安装 bitnami LAMP 堆栈。这是我到目前为止的 Dockerfile:
FROM ubuntu
EXPOSE 80 443 3306
WORKDIR /opt
COPY setup.sh .
RUN chmod +x setup.sh
RUN ./setup.sh # this bash script downloads and runs installer
CMD /opt/bitnami/ctlscript.sh start && tail -f /opt/bitnami/apache2/logs/access_log
然后我像这样运行那个容器:
docker run --name dev -d -p 8080:80 -p 3307:3306 -v "C:\\dev\\project:/opt/bitnami/apache2/htdocs" aburov/lamp5.6
除了我无法使用映射的 3307 端口从主机连接到 MySQL 之外,所有工作都按预期工作(应用程序可以通过它c:\dev\project
访问并且它可以访问数据库)。localhost:8080
我尝试从 MySQL Workbench 和 JetBrains 的 DataGrip 进行连接,都失败并出现类似错误:
与主节点的通信链路故障。没有找到 master 的活动连接。java.io.EOFException:流意外结束,从 4 读取 0 个字节(套接字已被服务器关闭)。
我试过了:
- 假设存在一些冲突,使用映射到另一个主机的端口(3306、3308、10123);
- 使用不同的 MySQL 驱动程序。
MySQL 版本是 5.6。
我错过了什么?先感谢您!
解决方案
在检查端口是否映射正确并验证本地 mysqlclient 是否可以连接到服务器后,还有另一种可能性。
MySQL 在默认配置中作为安全措施,只接受来自 localhost 的访问。
所以你必须控制和改变下面的参数my.cnf
[mysqld]
bind-address=0.0.0.0
这将允许从每个 ip访问
此外,默认情况下仅root
具有权限,localhost
因此不允许从其他主机与该用户连接。为了解决这个问题,我们可以在容器中执行以下 SQL 命令:
GRANT CREATE USER ON *.* TO 'root'@'%';
FLUSH PRIVILEGES;
另一种选择是创建单独的用户(通过从容器内运行相应的 SQL)。
推荐阅读
- azure - TCPing 时 Azure VM 端口关闭
- android - 在 ionic 上打开任何文件
- c# - 选择文本上的文本框更改
- listview - 如何在使用 Prism 时将带参数的命令绑定到 Syncfusion Listview...?
- go - 使用大量字符串理解 Golang 内存管理
- python-3.x - Python如何从字符串中撤销最后一个逗号
- c# - 启动新的 asp.net MVC 应用程序时出现 FileNotFoundException
- linux - 在 Docker 中使用 Docker 的父 Docker 容器
- javascript - 为什么构造函数中的 `this.state.text = "text"` 在 ReactJS 中不起作用?
- tensorflow - SQuAD Challenge 中的 EM 分数