返回

Docker 容器中 PostgreSQL 连接故障排查指南

Linux

Docker 容器中的 Postgres 疑难杂症排除指南

问题:Django 无法连接到 Postgres 数据库

在使用 Dockerfile 构建单个容器时,Django 无法连接到 Postgres 数据库。运行 python manage.py makemigrations && python manage.py migrate 时,日志显示连接被拒绝。

解决方法

1. 检查 Postgres 服务状态

  • 检查 Postgres 服务是否已启动:RUN service postgresql status
  • 如果未启动,启动服务:RUN service postgresql start

2. 允许 TCP/IP 连接

  • 确保 Postgres 正在监听 TCP/IP 连接:RUN sed -i 's/#listen_addresses = 'localhost'/listen_addresses = '*'/g' /etc/postgresql/postgresql.conf

3. 配置防火墙

  • 允许对 Postgres 端口(默认情况下为 5432)的连接:RUN ufw allow 5432/tcp

4. 验证连接设置

  • 检查 settings.py 文件中的以下设置:
    • HOST: Postgres 容器名称或 IP 地址
    • PORT: Postgres 端口
    • USER: Postgres 用户名
    • PASSWORD: Postgres 用户密码

5. 重新运行迁移

  • 重新运行迁移命令:RUN python manage.py makemigrations && python manage.py migrate

注意事项

  • 确保使用正确的 Postgres 版本。
  • 检查容器日志以获取更多详细信息:docker logs <container-name>

优化建议

  • 使用 COPY 而不是 RUN pip install 安装依赖项。
  • 使用多阶段构建分离构建过程。

结论

通过遵循这些步骤,您可以解决 Docker 容器中 Postgres 数据库的连接问题。

常见问题解答

1. 为什么我仍然无法连接到数据库?

  • 检查防火墙规则是否已正确配置。
  • 确保 Postgres 容器正在运行,并且其 IP 地址或名称与 settings.py 中的设置匹配。

2. 如何提高 Dockerfile 的效率?

  • 使用 COPY 代替 RUN pip install 安装依赖项。
  • 使用多阶段构建分离构建过程。

3. 我需要使用哪个 Postgres 版本?

  • 这取决于您使用的 Django 版本。检查 Django 文档以获取兼容的 Postgres 版本。

4. 如何检查 Postgres 容器的日志?

  • 使用 docker logs <container-name> 命令。

5. 如何优化 Docker 容器的性能?

  • 使用较小的基础镜像。
  • 仅安装必需的软件包。
  • 优化容器的内存和 CPU 使用。