当Docker容器无法连接主机上的数据库时,通常涉及网络配置问题。以下是常见原因和解决方案:
在容器内连接主机数据库时,不能使用localhost
或127.0.0.1
,因为这会指向容器自身。应该使用:
host.docker.internal
host.docker.internal
检查数据库配置是否监听所有网络接口:
bind-address
是否为0.0.0.0
listen_addresses
是否为'*'
net.bindIp
是否为0.0.0.0
启动容器时使用--network host
模式可以直接使用主机网络:
docker run --network host your_image
确保主机防火墙允许数据库端口通信:
# Linux示例
sudo ufw allow 3306/tcp # MySQL
sudo ufw allow 5432/tcp # PostgreSQL
确保数据库用户有从远程主机连接的权限:
-- MySQL示例
CREATE USER 'username'@'%' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON database.* TO 'username'@'%';
FLUSH PRIVILEGES;
创建自定义网络并连接容器:
docker network create my-network
docker run --network my-network --name my-db -e MYSQL_ROOT_PASSWORD=password -d mysql
docker run --network my-network -it your_application_image
在容器内测试网络连通性:
docker exec -it your_container ping host.docker.internal
测试端口连通性:
docker exec -it your_container telnet host.docker.internal 3306
检查容器日志:
docker logs your_container
检查数据库日志中的连接尝试记录
通过以上方法,您应该能够解决Docker容器连接本地数据库的问题。