如何访问使用 docker-compose 设置的 postgresql 数据库?

Posted

技术标签:

【中文标题】如何访问使用 docker-compose 设置的 postgresql 数据库?【英文标题】:How do I access a postgresql DB that was setup with docker-compose? 【发布时间】:2022-01-23 03:10:29 【问题描述】:

我使用以下 docker-compose.yml 文件:

version: '3.8'

services:
  db:
    image: postgres:13-alpine
    volumes:
      - postgres_data:/var/lib/postgresql/data/
    expose:
      - 5432
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
      - POSTGRES_DB=testdb
volumes:
  postgres_data:

我用docker-compose up -d --build 提出来。现在,当我尝试从 Python 访问它时,例如,使用 psycopg2 出现以下错误

>>> conn = psycopg2.connect(host="localhost", database="testdb", user="postgres", password="postgres")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.9/site-packages/psycopg2/__init__.py", line 122, in connect
    conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
psycopg2.OperationalError: connection to server at "localhost" (::1), port 5432 failed: Connection refused
    Is the server running on that host and accepting TCP/IP connections?
connection to server at "localhost" (127.0.0.1), port 5432 failed: Connection refused
    Is the server running on that host and accepting TCP/IP connections?

>>> conn = psycopg2.connect(host="db", database="testdb", user="postgres", password="postgres")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.9/site-packages/psycopg2/__init__.py", line 122, in connect
    conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
psycopg2.OperationalError: could not translate host name "db" to address: nodename nor servname provided, or not known

你能帮我解决这个问题吗?

【问题讨论】:

localhost 是正确的。使用ports: [5432:5432] 而不是expose 选项。 【参考方案1】:

问题是expose 没有将端口发布到主机。它们只能由链接的服务访问。

您必须手动发布端口:

docker-compose run -d -p 5432:5432 db

【讨论】:

你也可以将这个添加到docker-compose:ports: - "5432:5432"【参考方案2】:

您应该从 docker-compose.yml 文件中删除公开选项并添加端口选项,例如:

ports:
  -"5432:5432"

然后您可以通过主机localhost 从您的应用程序连接到数据库。

【讨论】:

【参考方案3】:

而不是使用向我们公开这个来代替:

ports:
  - "5432:5432"

这定义了端口转发到 docker 容器

【讨论】:

以上是关于如何访问使用 docker-compose 设置的 postgresql 数据库?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Docker-Compose 文件运行 Phpmyadmin、Mysql 和 Apache Tomcat?

如何在 docker-compose 中访问 Postgres 数据库

无法使用nginx-proxy和dnsmasq在带有docker-compose的容器之间访问虚拟主机

如何在 docker-compose 上使用 nodejs 在 mongoDB 上设置身份验证?

docker-compose java 无法访问 jarfile

Pycharm docker-compose解释器不加载库