Docker Compose部署Streamlit+MariaDB连接失败问题求助
解决Streamlit应用Docker化后无法连接MariaDB的问题
错误原因分析
你遇到的OperationalError: (2003, "Can't connect to MySQL server on 'localhost' ([Errno 99] Cannot assign requested address)")错误,核心原因是Docker容器的网络隔离特性:在Streamlit应用容器里,localhost指向容器自身,而你的MariaDB运行在另一个独立的database容器中,因此无法通过localhost访问。
具体配置调整步骤
1. 修正数据库连接地址
- 打开Streamlit应用代码或
.env配置文件,将数据库连接的host参数从localhost改为database(对应docker-compose.yml中MariaDB服务的名称)。 - 示例连接代码修改:
conn = mysql.connector.connect( host="database", user=os.getenv("MYSQL_USER"), password=os.getenv("MYSQL_PASSWORD"), database=os.getenv("MYSQL_DATABASE") ) - 若用
.env管理配置,确保其中MYSQL_HOST变量值为database,而非localhost。
2. 优化Docker Compose网络配置(可选但更规范)
Docker Compose默认会为所有服务创建共享网络,服务间可通过名称互访。你可以显式声明网络,让配置更清晰:
在docker-compose.yml末尾添加以下内容:
networks: default: name: app-internal-network
所有服务会自动加入该自定义网络,名称解析更稳定。
3. 验证MariaDB环境变量配置
确保.env文件包含完整的MariaDB初始化变量,示例:
MYSQL_ROOT_PASSWORD=your_root_password MYSQL_DATABASE=your_target_db MYSQL_USER=your_db_user MYSQL_PASSWORD=your_user_password
这些变量会被MariaDB容器自动读取,完成数据库初始化。
4. 重启服务验证
执行以下命令重新构建并启动服务:
docker-compose down docker-compose up --build -d
查看应用容器日志确认连接状态:
docker logs app
关键原理说明
Docker Compose会为每个服务分配容器内部IP,同时通过内置DNS将服务名称(如database)映射到对应容器的IP。同一Compose项目下的服务,必须使用服务名称作为主机名通信,而非localhost或宿主机IP。
内容的提问来源于stack exchange,提问作者divyashie
相关产品推荐
相关产品推荐

