返回

在 Docker 容器中连接外部 PSQL 数据库的详细指南

Linux

Docker 容器中连接外部 PSQL 数据库的指南

问题概述

在 Docker 容器中连接到外部数据库至关重要,尤其是当数据库位于同一主机上时。然而,许多用户在尝试连接到外部 PSQL 数据库时会遇到问题。本文将深入探讨问题的原因,并提供分步指南,帮助你在 Linux Ubuntu 上的 Docker 容器中成功建立连接。

解决方案

步骤 1:检查数据库配置

首先,验证外部 PSQL 数据库是否允许外部连接。修改 postgresql.conf 文件,添加 host 规则:

# postgresql.conf
...
listen_addresses = '*'
host    all             all             0.0.0.0/0               md5
...

步骤 2:创建自定义网络

默认情况下,Docker 容器使用自己的网络命名空间。创建一个自定义网络(例如 my-network ),允许容器与外部数据库通信:

docker network create my-network

步骤 3:更新 Docker Compose 文件

在 Docker Compose 文件中,将容器连接到 my-network 网络,并指定外部数据库的连接参数:

services:
  container_name:
    ...
    networks:
      - my-network
    environment:
      - POSTGRES_HOST=psql-db
      - POSTGRES_PORT=5432
      - POSTGRES_USER=dbuser
      - POSTGRES_PASSWORD=dbpassword
      - POSTGRES_DB=dbname

networks:
  my-network:
    external: true

步骤 4:创建 PSQL 服务(可选)

如果外部数据库未在 Docker Compose 文件中定义,则创建 psql-db 服务表示外部数据库:

services:
  psql-db:
    image: postgres
    networks:
      - my-network
    environment:
      - POSTGRES_USER=dbuser
      - POSTGRES_PASSWORD=dbpassword
      - POSTGRES_DB=dbname

步骤 5:启动 Docker Compose

运行 docker-compose up -d 命令启动容器并连接到外部数据库。

步骤 6:测试连接

在容器内使用 psql 命令测试连接:

docker exec -it container_name psql -h psql-db -U dbuser -d dbname

成功连接后,你会看到类似以下的输出:

dbname=#

常见问题解答

1. 我收到 "连接到服务器失败" 错误。

  • 检查数据库配置是否正确。
  • 确保外部数据库允许外部连接。
  • 确认自定义网络已创建且配置正确。

2. 容器无法解析外部数据库的主机名。

  • 在容器的 /etc/hosts 文件中添加 host.docker.internal 条目,指向外部数据库的 IP 地址。
  • 使用 docker-composeextra_hosts 选项映射主机名到 IP 地址。

3. 我无法在容器内访问数据库。

  • 确保容器和外部数据库位于同一网络上。
  • 检查防火墙规则是否允许容器访问外部数据库。
  • 验证容器的 POSTGRES_HOST 环境变量已正确设置。

4. Docker Compose 文件中的 "external" 标志是什么意思?

  • external 标志指示 Docker Compose 使用预先存在的网络,而不是创建自己的网络。

5. 为什么自定义网络对于连接外部数据库是必需的?

  • Docker 容器默认使用自己的网络命名空间,这会限制容器与外部网络的通信。创建自定义网络使容器能够与外部数据库通信。

总结

通过遵循本文中概述的步骤,你可以在 Linux Ubuntu 上的 Docker 容器中成功连接到外部 PSQL 数据库。解决连接问题的关键在于仔细检查数据库配置,创建自定义网络,并更新 Docker Compose 文件。通过采取这些措施,你可以确保你的应用程序可靠地访问外部数据库,并充分利用容器化的优势。