Docker环境下Python/PHP脚本无法连接MySQL容器求助
问题:Docker部署MySQL后连接脚本无响应
环境与配置
用户使用以下docker-compose.yml部署MySQL和Adminer:
version: '3.1' services: db: image: mysql # NOTE: use of "mysql_native_password" is not recommended: https://dev.mysql.com/doc/refman/8.0/en/upgrading-from-previous-series.html#upgrade-caching-sha2-password # (this is just an example, not intended to be a production configuration) command: --default-authentication-plugin=mysql_native_password restart: always environment: MYSQL_ROOT_PASSWORD: example MYSQL_DATABASE: database adminer: image: adminer restart: always ports: - 3306:8080
PHP连接脚本:
<?php $conn = mysqli_connect('127.0.0.1', 'root', 'example', 'database'); if ($conn->connect_errno) { echo("failed"); exit(); } $conn->close(); ?>
Python连接脚本:
import mysql.connector mydb = None try: mydb = mysql.connector.connect( host="127.0.0.1", user="root", password="database", use_pure=True ) except Exception as e: print(e) print(mydb)
docker-compose日志:
adminer_1 | [Thu Aug 11 22:03:52 2022] [::ffff:172.18.0.1]:56018 Accepted
测试环境为php8.0-cli和python3,连接脚本均出现卡住无响应的情况。
原因分析
- 端口映射完全错误:
Adminer容器的8080端口被映射到了宿主机的3306端口,而MySQL容器根本没有将自身的3306端口暴露给宿主机。此时脚本连接127.0.0.1:3306实际是连到了Adminer服务,而非MySQL,这会导致连接请求无响应。 - Python脚本密码错误:
Python脚本中填写的密码是database,但docker-compose.yml中设置的MySQL root密码是example,密码不匹配。不过因为端口连接错误,错误信息无法正常抛出,直接表现为脚本卡住。 - MySQL容器未开放宿主机访问端口:
db服务未配置ports字段,宿主机无法直接访问容器内的MySQL服务端口,必须添加端口映射才能让外部脚本连接。
修复方案
修正docker-compose.yml的端口配置:
调整Adminer的端口映射,同时给MySQL添加宿主机端口映射,避免端口冲突:version: '3.1' services: db: image: mysql command: --default-authentication-plugin=mysql_native_password restart: always environment: MYSQL_ROOT_PASSWORD: example MYSQL_DATABASE: database ports: - "3306:3306" # 添加MySQL端口映射 adminer: image: adminer restart: always ports: - "8080:8080" # 修正Adminer端口映射,避免占用3306修正Python脚本的错误:
修正密码并添加要连接的数据库名称:import mysql.connector mydb = None try: mydb = mysql.connector.connect( host="127.0.0.1", user="root", password="example", # 修正为正确密码 database="database", # 添加要连接的数据库 use_pure=True ) except Exception as e: print(e) print(mydb)
内容的提问来源于stack exchange,提问作者Michał Kruk
相关产品推荐
相关产品推荐

