Docker中MariaDB/MySQL容器拒绝其他容器连接的问题求助
MySQL容器无法接收其他容器连接的问题排查与解决
问题详情
MySQL容器无法接收来自其他容器的连接,操作及现象如下:
- 创建自定义桥接网络:
docker network create -d bridge mysql
- 启动数据库容器:
docker run --name mysql_db -d \ --network mysql \ -e MYSQL_ROOT_PASSWORD=pass \ -e MYSQL_USER=user \ -e MYSQL_PASSWORD=pass \ -e MYSQL_DATABASE=database \ -e MYSQL_ROOT_HOST=% \ mariadb
- 数据库容器日志显示已就绪:
$ docker logs mysql_db 2022-11-06 21:46:01 0 [Note] mariadbd: ready for connections. Version: '10.9.3-MariaDB-1:10.9.3+maria~ubu2204' socket: '/run/mysqld/mysqld.sock' port: 3306 mariadb.org binary distribution
- 同一网络下的第二个容器连接MySQL失败:
$ php -r "new mysqli('mysql_db','root', 'pass','database');" $ PHP Warning: mysqli::__construct(): (HY000/2002): Connection refused in Command line code on line 1
- 第二个容器ping数据库容器网络不通:
# ping mysql_db PING mysql_db (172.18.0.2): 56 data bytes .... --- mysql_db ping statistics --- 6 packets transmitted, 0 packets received, 100% packet loss
使用mysql:5.7镜像时出现相同问题。
解决步骤
1. 确认第二个容器已加入目标网络
检查第二个容器的网络归属:
docker inspect <第二个容器名称/ID> | grep Networks
若输出无mysql网络,执行以下命令将其加入:
docker network connect mysql <第二个容器名称/ID>
2. 验证数据库容器的网络配置
确认数据库容器正常挂载在mysql网络:
docker inspect mysql_db | grep Networks
若网络配置异常,备份数据后重建容器:
docker stop mysql_db && docker rm mysql_db # 重新执行原启动命令创建容器
3. 检查数据库监听地址
部分情况下数据库仅监听127.0.0.1,导致外部容器无法访问。进入容器查看监听端口:
docker exec -it mysql_db netstat -tulpn | grep 3306
若输出为127.0.0.1:3306,修改MySQL配置:
- 进入容器编辑配置文件(如
/etc/mysql/my.cnf),将bind-address改为0.0.0.0 - 重启容器:
docker restart mysql_db
4. 测试Docker网络的DNS解析
若ping容器名称不通,先尝试用容器IP直接连接:
# 获取数据库容器IP docker inspect mysql_db | grep "IPAddress" # 在第二个容器中用IP连接测试 php -r "new mysqli('172.18.0.2','root', 'pass','database');"
若IP可连接但名称不行,重启Docker服务:
systemctl restart docker
5. 排查宿主机防火墙
临时关闭宿主机防火墙测试是否为规则阻断:
# Ubuntu系统示例 ufw disable # 测试完成后重新开启:ufw enable
内容的提问来源于stack exchange,提问作者dsl400
相关产品推荐
相关产品推荐

