MacOS主机通过Python脚本访问Docker Compose中MariaDB容器失败求助
解决MacOS主机Python访问Docker Compose部署MariaDB的问题
核心问题本质
主机上的Python脚本不在Docker Compose的专属网络环境中,无法直接通过容器名mariadb访问服务;同时需确保MariaDB允许外部连接、端口映射正常生效。
具体解决步骤
1. 修正Python连接的主机地址
主机脚本不能用容器名mariadb作为连接地址,需替换为以下两种地址之一:
localhost:利用Docker的端口映射规则(3306:3306)直接访问host.docker.internal:MacOS Docker Desktop提供的特殊地址,用于主机访问容器内服务
示例Python连接代码(基于mariadb包):
import mariadb try: conn = mariadb.connect( user="test", password="mysqlpw", host="localhost", # 替换为 host.docker.internal 也可 port=3306, database="test1" ) cursor = conn.cursor() print("连接成功!") except mariadb.Error as e: print(f"连接失败:{e}") finally: if 'conn' in locals(): conn.close()
2. 确保MariaDB用户允许远程访问
默认创建的MariaDB用户仅允许容器内部localhost访问,需修改权限开放外部连接:
- 进入MariaDB容器:
docker exec -it mariadb mysql -u root -pmysqlroot - 在MariaDB命令行执行权限修改:
其中GRANT ALL PRIVILEGES ON test1.* TO 'test'@'%' IDENTIFIED BY 'mysqlpw'; FLUSH PRIVILEGES;%表示允许任意地址访问,也可指定具体IP范围进一步限制。
3. 检查端口占用与防火墙
- 确认主机3306端口未被其他程序占用:
若有占用,停止对应程序或修改Docker端口映射(比如改为lsof -i :33063307:3306,同时Python代码端口改为3307)。 - 临时关闭MacOS防火墙测试连接,若能成功则添加规则允许3306端口的入站访问。
4. 优化Docker Compose配置(可选)
不建议手动指定network_mode: bridge,Docker Compose默认会创建专属网络,既不影响容器间通信,也能正常映射端口到主机。修改后配置示例:
version: '3.9' services: mariadb: image: mariadb:10.9.1-rc container_name: mariadb ports: - 3306:3306 volumes: - ... environment: - MYSQL_ROOT_PASSWORD=mysqlroot - MYSQL_PASSWORD=mysqlpw - MYSQL_USER=test - MYSQL_DATABASE=test1 - TZ=Europe/Berlin phpmyadmin: image: phpmyadmin:5.2.0 container_name: pma environment: - PMA_HOST=mariadb - PMA_PORT=3306 - TZ=Europe/Berlin ports: - 8081:80
默认网络下,phpMyAdmin依然可以用mariadb作为主机地址连接,同时主机通过端口映射访问不受影响。
内容的提问来源于stack exchange,提问作者JulMai
相关产品推荐
相关产品推荐

