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
相关产品推荐
相关产品推荐

