Docker中PHP、Adminer容器无法连接MySQL容器求助
问题排查与解决步骤
1. 确保容器处于同一网络
默认docker-compose会自动创建项目专属网络,但显式指定网络可避免潜在连通问题。修改你的docker-compose.yml,添加统一网络配置:
version: '3.1' networks: app-network: driver: bridge services: php: build: context: . dockerfile: Dockerfile volumes: - ./html:/var/www/html ports: - 80:80 networks: - app-network db: image: mysql:5.7 volumes: - ./mysql:/var/lib/mysql environment: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: test MYSQL_USER: test MYSQL_PASSWORD: test ports: - 3360:3306 networks: - app-network adminer: image: adminer restart: always ports: - 8080:8080 networks: - app-network
保存后重新执行docker-compose up -d,确保三个容器都加入同一网络。
2. 修正MySQL用户访问权限
你创建的test用户默认仅允许localhost访问,而Adminer从容器内部连接时,来源是容器IP而非localhost。需要调整用户权限:
- 进入MySQL容器:
docker exec -it [你的db容器名称] mysql -uroot -proot - 执行授权SQL:
GRANT ALL PRIVILEGES ON test.* TO 'test'@'%' IDENTIFIED BY 'test'; FLUSH PRIVILEGES;
授权完成后,test用户即可从任意主机(包括其他容器)连接MySQL。
3. 验证容器间连通性
进入Adminer容器直接测试MySQL连接,定位问题环节:
- 进入Adminer容器:
docker exec -it [你的adminer容器名称] sh - 安装MySQL客户端(若容器内无此工具):
apt update && apt install -y mysql-client - 测试连接:
mysql -h db -u test -p test,输入密码test。若能成功连接,说明网络和权限无问题,可排查Adminer操作;若连接失败,根据错误提示进一步定位。
4. 确认MySQL服务完全就绪
日志显示ready for connections不代表初始化完全完成,首次启动MySQL容器需要一定时间加载数据。可等待30秒至1分钟后再尝试Adminer登录,或查看完整日志确认无初始化错误:docker logs [你的db容器名称]。
5. 检查MySQL监听端口
进入db容器,确认MySQL在全地址监听而非仅本地:
docker exec -it [你的db容器名称] netstat -tulpn | grep 3306
若输出显示0.0.0.0:3306,说明端口正常对外监听;若仅显示127.0.0.1:3306,需修改MySQL配置文件允许远程监听。
内容的提问来源于stack exchange,提问作者Deuniru
相关产品推荐
相关产品推荐

