Docker部署MySQL无法通过C++ Poco连接,求解决方案
问题:MacOS 12.6连接Docker容器内MySQL失败
我在MacOS 12.6系统中,尝试连接Docker容器内的MySQL数据库,但多次尝试均失败!
注: 已试过相似问题的方案,无效。
以下是我的C++连接代码:
#include <iostream> #include <string> #include <Poco/Data/MySQL/MySQLException.h> #include <Poco/Data/MySQL/Connector.h> #include <Poco/Data/SessionFactory.h> using namespace std; int main() { Poco::Data::MySQL::Connector::registerConnector(); try { string str = "host=0.0.0.0;port=3306;user=admin;db=myServiceDb;password=password;compress=true;auto-reconnect=true"; Poco::Data::Session test(Poco::Data::SessionFactory::instance().create(Poco::Data::MySQL::Connector::KEY, str)); } catch (Poco::Data::ConnectionFailedException &e) { cout << e.what() << endl; return -1; } return 0; }
以下是Docker Compose配置:
services: myServiceDb: image: mysql:latest restart: always environment: MYSQL_DATABASE: ' myServiceDb' MYSQL_USER: 'admin' MYSQL_PASSWORD: 'password' MYSQL_ROOT_PASSWORD: 'rootpassword' ports: - '3306:3306' expose: - '3306'
我已尝试将host改为localhost、0.0.0.0、127.0.0.1,也试过用Python连接,均失败。但奇怪的是,使用相同凭据通过MySQLWorkbench可以正常连接,我认为问题出在MySQL本身。请问需要修改什么才能成功连接?
解决方案
修正数据库名称的空格问题
你的Docker Compose里MYSQL_DATABASE: ' myServiceDb'的值前多了一个空格,实际创建的数据库是myServiceDb(带前导空格),但代码里指定的是无空格的myServiceDb,导致数据库匹配失败。修改Docker Compose的环境变量:MYSQL_DATABASE: 'myServiceDb'调整用户访问权限
MySQL默认创建的用户可能仅允许localhost连接,虽然Workbench能连,但程序连接会受权限限制。进入容器执行以下命令,给admin用户开放所有主机的访问权限:# 进入MySQL容器 docker exec -it [容器ID/名称] mysql -uroot -prootpassword # 授予权限并刷新 GRANT ALL PRIVILEGES ON myServiceDb.* TO 'admin'@'%' IDENTIFIED BY 'password'; FLUSH PRIVILEGES;替换连接字符串的主机地址
在MacOS上访问Docker容器内的服务,建议使用Docker提供的专用域名host.docker.internal,替换代码中的0.0.0.0:string str = "host=host.docker.internal;port=3306;user=admin;db=myServiceDb;password=password;compress=true;auto-reconnect=true";重启容器生效配置
执行命令重启容器,确保所有修改生效:docker-compose down && docker-compose up -d
内容的提问来源于stack exchange,提问作者Edison
相关产品推荐
相关产品推荐

