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

Docker容器间连接故障:Alpine无法连接MySQL容器(socket错误)

解决Alpine容器无法连接MySQL容器的问题

从你的错误日志来看,核心问题是你的Python应用试图通过本地Unix socket(/run/mysqld/mysqld.sock)连接MySQL,但这个socket仅存在于MySQL容器内部,Alpine容器根本无法访问它。容器间的数据库连接应该用TCP/IP网络通信,下面是具体的解决步骤:

1. 确保两个容器在同一个Docker网络中

Docker容器默认使用bridge网络,但创建自定义网络能更可靠地保证容器间通过名称(比如你的docker-mysql)解析通信:

  • 先创建自定义网络:
    docker network create abe-network
    
  • 重启两个容器并加入这个网络(如果容器已经运行):
    # 重启MySQL容器并加入网络
    docker run --name docker-mysql --network abe-network -d [你的MySQL镜像名]
    # 重启Alpine容器并加入网络
    docker run --name alpine-abe --network abe-network -d [你的Alpine镜像名]
    
    如果你用Docker Compose,直接在配置文件里给两个容器指定同一个networks项即可。

2. 修改数据库连接配置,强制使用TCP/IP连接

当前配置没有明确指定连接方式,mysqlclient默认会优先尝试Unix socket连接。需要在connect-args里添加unix_socket=None强制走TCP,同时注意容器间连接要用MySQL容器的内部端口3306,而非宿主机的映射端口32779:
修改后的abe-my.conf配置如下:

dbtype MySQLdb
connect-args {"user":"abe","db":"abe","passwd":"123", "unix_socket":None}
upgrade
host docker-mysql
port 3306

3. 验证MySQL用户的连接权限

确保你的MySQL用户abe允许从Alpine容器的IP或任意地址连接,默认MySQL用户可能仅限制localhost访问:

  • 进入MySQL容器:
    docker exec -it docker-mysql mysql -uroot -p
    
  • 执行授权命令(若未授权):
    GRANT ALL PRIVILEGES ON abe.* TO 'abe'@'%' IDENTIFIED BY '123';
    FLUSH PRIVILEGES;
    
    这里的%表示允许从任意地址连接,若需更严格权限,可指定Alpine容器的IP段。

4. 测试容器间的网络连通性

在Alpine容器内先ping MySQL容器名称,确认网络可达:

docker exec -it alpine-abe ping docker-mysql

若ping通,再用telnet测试3306端口是否开放:

docker exec -it alpine-abe telnet docker-mysql 3306

如果telnet能成功连接,说明网络正常,问题大概率出在应用连接配置上。

完成以上步骤后,重启你的Python应用,应该就能正常连接到MySQL容器了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 09:02:09