当 Docker 容器无法连接 MySQL 时,可能是由多种原因导致的。以下是常见问题及解决方案:
docker ps
确保 MySQL 容器状态为 "Up"。如果没有运行,尝试启动:
docker start [容器名/ID]
如果应用和 MySQL 是分开的容器,确保它们在同一个 Docker 网络中:
docker network ls
docker network inspect [网络名]
如果需要:
docker network create my-network
docker network connect my-network mysql-container
docker network connect my-network app-container
进入 MySQL 容器:
docker exec -it mysql-container mysql -u root -p
执行以下 SQL:
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'yourpassword';
FLUSH PRIVILEGES;
确保 MySQL 监听所有接口(0.0.0.0)而不仅仅是本地(127.0.0.1)。
在 my.cnf
中添加或修改:
[mysqld]
bind-address = 0.0.0.0
确保 MySQL 端口正确映射:
docker ps -a
查找 MySQL 容器的端口映射,类似:
0.0.0.0:3306->3306/tcp
如果没有正确映射,重新运行容器时添加 -p 3306:3306
参数。
如果宿主机有防火墙,确保 3306 端口开放:
sudo ufw allow 3306
确保应用使用正确的连接参数: - 主机名:如果是同一 Docker 网络,使用容器名作为主机 - 端口:默认 3306 - 用户名和密码:与 MySQL 配置一致
示例连接字符串:
jdbc:mysql://mysql-container:3306/database?useSSL=false
检查 MySQL 容器日志:
docker logs mysql-container
检查应用容器日志:
docker logs app-container
如果问题持续,尝试重新创建 MySQL 容器:
docker stop mysql-container
docker rm mysql-container
docker run --name mysql-container -e MYSQL_ROOT_PASSWORD=yourpassword -p 3306:3306 -d mysql:latest
version: '3'
services:
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: rootpassword
MYSQL_DATABASE: mydb
MYSQL_USER: user
MYSQL_PASSWORD: password
ports:
- "3306:3306"
volumes:
- db_data:/var/lib/mysql
networks:
- my-network
app:
build: .
depends_on:
- db
environment:
DB_HOST: db
DB_PORT: 3306
networks:
- my-network
networks:
my-network:
driver: bridge
volumes:
db_data:
通过以上步骤,应该能够解决大多数 Docker 连接 MySQL 的问题。如果仍有问题,请提供具体的错误信息以便进一步诊断。