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服务,导致连接失败。
解决方案步骤
修改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容器。替换不可靠的
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
相关产品推荐
相关产品推荐

