You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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服务端口,必须添加端口映射才能让外部脚本连接。

修复方案

  1. 修正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
    
  2. 修正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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 05:06:42