Docker Swarm中Drupal连接PostgreSQL超时问题求助
解决方案
1. 修正数据库服务名拼写错误
你的PostgreSQL服务创建命令里名称是postgress(多了一个s),如果Drupal配置里填写的是正确拼写postgres,会导致无法解析主机。
- 要么修改Drupal配置中的主机名为
postgress - 要么删除现有数据库服务,重新创建正确名称的服务:
docker service rm postgress docker service create --name postgres --network my_net -e POSTGRES_PASSWORD=akash postgres
2. 验证数据库服务状态
- 查看服务是否正常运行:
确保docker service lspostgres(或postgress)服务的REPLICAS显示为1/1,状态为Running。 - 查看数据库启动日志,确认没有初始化错误:
日志中应该出现类似docker service logs postgres # 或postgress,根据实际服务名database system is ready to accept connections的提示,说明数据库已就绪。
3. 测试容器间网络连通性
在同一网络下启动临时容器,测试与数据库服务的连通性:
- 测试ping解析:
docker run --rm --network my_net busybox ping -c 3 postgres # 替换为你的数据库服务名 - 测试PostgreSQL端口(5432)是否可访问:
如果连接成功,说明网络和端口没问题;如果失败,检查网络配置。docker run --rm --network my_net busybox telnet postgres 5432
4. 确认Docker Swarm网络类型
确保my_net是overlay网络(Swarm服务跨节点通信必须用overlay网络):
docker network inspect my_net
查看输出中Driver字段是否为overlay。如果是bridge网络,仅能在同一节点的容器间通信,若两个服务部署在不同Swarm节点,会导致连接超时。此时需要重新创建overlay网络:
docker network rm my_net docker network create --driver overlay my_net
之后重新部署两个服务到新网络。
5. 检查Drupal数据库配置细节
确保Drupal配置中的以下参数正确:
- 主机名:与PostgreSQL服务名完全一致(
postgres或postgress) - 端口:默认
5432(无需修改,除非你自定义了PostgreSQL端口) - 数据库名称:默认是
postgres(因为你没设置POSTGRES_DB环境变量) - 用户名:默认
postgres - 密码:你设置的
akash
6. 处理服务启动顺序问题
PostgreSQL初始化数据库需要时间,若Drupal服务先启动完成,此时数据库还未就绪,会导致连接超时。可以:
- 手动等待数据库日志显示就绪后,再进行Drupal的数据库配置
- 给Drupal服务添加健康检查,确保数据库可用后再正常对外提供服务:
docker service update --health-cmd "pg_isready -h postgres -U postgres" --health-interval 10s --health-retries 3 my_web
内容的提问来源于stack exchange,提问作者AKASH
相关产品推荐
相关产品推荐

