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

Docker Compose中MariaDB连接失败求助(Errno 111)

问题解决:Docker Compose中MariaDB容器连接失败

报错信息

  • worker容器连接失败:

worker-1 | sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (2003, "Can't connect to MySQL server on 'db' ([Errno 111] Connection refused)")

  • 另一个容器权限错误:

Access denied for user 'root'@'172.24.0.9' (using password: NO)

问题排查与解决方案

1. 修复Worker容器的依赖配置

当前worker服务的depends_on只声明了cache,未包含db。虽然depends_on不保证数据库完全就绪,但至少能确保Compose优先启动DB服务,避免Worker在DB初始化前尝试连接。修改worker的配置:

worker:
  # ...其他配置保留
  depends_on:
    - cache
    - db  # 添加该行依赖

2. 清理旧数据库卷,重新初始化MariaDB

如果.data/mysql卷存在旧数据,可能导致MariaDB初始化时未正确创建user1用户或数据库。执行以下命令重置:

# 停止并删除容器及关联卷
docker-compose down -v
# 重新启动所有服务
docker-compose up -d

启动后查看DB日志确认初始化完成:

docker-compose logs db

日志中出现ready for connections字样说明DB已就绪。

3. 排查“root无密码访问”错误

该错误表明有服务在使用root用户连接DB且未提供密码,需做以下检查:

  • 确认所有服务的代码/配置未硬编码root用户连接数据库,统一使用配置好的user1账号
  • 检查所有连接DB的服务环境变量,确保使用正确的连接格式:mysql+pymysql://user1:user1@db/user1

4. 验证容器网络连通性

在worker容器内测试与db的连通性,确认网络无问题:

# 进入worker容器
docker-compose exec worker bash
# 测试DB服务DNS解析
ping db
# 测试3306端口是否开放
telnet db 3306

若telnet能连通,说明网络正常,问题出在DB初始化或应用配置层面。

完整修改后的Docker Compose关键片段

version: '3'

services:
  worker:
    build:
      context: .
      dockerfile: Dockerfile-Worker
    user: root
    restart: always
    environment:
      DATABASE_URL: mysql+pymysql://user1:user1@db/user1
      REDIS_URL: redis://cache:6379
      UPLOAD_PROVIDER: s3
      FILE_QUARANTINE_URL: http://file-quarantine:7000/quarantine-file
    volumes:
      - .:/opt/xxx
    depends_on:
      - cache
      - db  # 新增DB依赖
    networks:
        default:
        internal:
        cf-net:

  # ...其余服务配置保持不变

内容的提问来源于stack exchange,提问作者Colin Bowen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 03:41:20