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

Docker容器应用无法连接MySQL服务,本地可正常连接求助

问题解决:Docker化Python应用无法连接Docker Compose编排的MySQL服务

核心问题原因

在Docker容器内部,127.0.0.1指向的是容器自身的本地回环地址,而非宿主机。本地运行Python应用时,127.0.0.1指向宿主机,宿主机通过端口映射3306:3306将请求转发到MySQL容器,因此能正常连接;但Python容器内访问127.0.0.1:3306时,找不到对应的MySQL服务,导致连接失败。

解决方案步骤

  1. 修改Python应用的数据库连接配置
    将app.py中的host值从127.0.0.1替换为Docker Compose中MySQL服务的名称db:

    import mysql.connector
    
    server_config = {
        'user': 'my_user',
        'password': 'my_password',
        'host': 'db',  # 替换为服务名db
        'database': 'db',
        'port': 3306,
    }
    conn = mysql.connector.connect(**server_config)
    cursor = conn.cursor()
    
    print('db has been connected')
    

    Docker Compose会自动为同一网络内的服务创建DNS解析,通过服务名db可直接访问MySQL容器。

  2. 替换不可靠的sleep等待机制
    原配置用sleep 20s等待MySQL启动的方式不可靠,建议通过healthcheck和depends_on的状态判断实现可靠等待,修改docker-compose.yml:

    version: '3.8'
    
    services:
      app:
        build: ./
        command: python3 ./app.py
        depends_on:
          db:
            condition: service_healthy  # 等待db服务进入健康状态
      db:
        image: mysql:8.0.20
        restart: always
        environment:
          MYSQL_DATABASE: 'db'
          MYSQL_USER: 'my_user'
          MYSQL_PASSWORD: 'my_password'
          MYSQL_ROOT_PASSWORD: 'my_root_password'
        ports:
          - '3306:3306'
        healthcheck:
          test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p${MYSQL_ROOT_PASSWORD}"]
          interval: 5s
          timeout: 5s
          retries: 5
    

    配置后Python应用会在MySQL服务完全启动并可接收连接后才运行。

验证修改

重新构建并启动服务:

docker-compose down && docker-compose up --build

此时Python容器应能正常连接MySQL服务,输出db has been connected。

内容的提问来源于stack exchange,提问作者Moro Wenka

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 01:45:33