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

Posted

技术标签:

【中文标题】如何在 docker-compose 中访问 Postgres 数据库【英文标题】:How to access Postgres database within docker-compose 【发布时间】:2018-04-06 21:22:48 【问题描述】:

我对 Postgres 和 Docker 还很陌生,但我正在使用 Django 构建一个 webapp,它在带有 postgresql 数据库的 docker 内运行。我正在尝试通过命令提示符或 pgweb 查看我的 Postgres 数据库。

不幸的是,我似乎根本找不到数据库,我尝试使用 postgres psql 终端命令,但我的数据库没有在里面列出。我的问题是,postgresql 数据库如何存储在 docker-compose 容器中。我需要手动进入容器然后查看数据库吗?我的最终目标是能够在 postgresql 数据库中查看我所有的表和数据的列表。

任何解释 postgresql 数据库如何与 docker-compose 交互的文档将不胜感激。

谢谢!

我最近刚刚添加了 Pgweb,但这似乎不起作用

Local.YML

version: '2'

volumes:
  postgres_data_local: 
  postgres_backup_local: 

services:
  django:
    build:
      context: .
      dockerfile: ./compose/local/django/Dockerfile
    depends_on:
      - postgres
    volumes:
      - .:/app
    environment:
      - POSTGRES_USER=vicki
      - USE_DOCKER=yes
    ports:
      - "8000:8000"
    command: /start.sh

  postgres:
    build:
      context: .
      dockerfile: ./compose/production/postgres/Dockerfile
    volumes:
      - postgres_data_local:/var/lib/postgresql/data
      - postgres_backup_local:/backups
    environment:
      - POSTGRES_USER=vicki

  pgweb:
    container_name: pgweb  
    restart: always  
    image: sosedoff/pgweb
    ports:
      - "8081:8081"
    links:
      - postgres:postgres  
    environment:
      - DATABASE_URL=postgres://postgres:postgres@postgres:5432/postgres
    depends_on:
      - postgres 

这是我正在谈论的 Postgres 终端 psql,当我打开终端并运行时:

postgres@dom-Inspiron-7559:~$ psql
psql (9.3.19)
Type "help" for help.

postgres=# \l
postgres=# 

这个数据库列表出现了,但是我不相信 vickibot 和 vicki 是一样的。 (我用 django cookiecutter 制作了两个应用程序,一个在 docker 中,一个不在 docker 中。我相信我现在使用的一个是 docker 容器中的“vicki”,但我又不确定也不知道知道如何判断我的模型文件引用的数据库。我想知道是否需要以某种方式进入 docker 容器来查看数据库)

                                  List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   
-----------+----------+----------+-------------+-------------+-----------------------
 postgres  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 template0 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 template1 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 test1     | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 vickibot  | dominic  | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
(5 rows)

【问题讨论】:

您是否尝试将相同的链接:links: - postgres:postgres 添加到 django 服务? 还有“我尝试使用 postgres psql 终端”你指的是哪个终端? @Zalkota 嗨 Sergiu,我不确定你的意思是链接,我尝试将 postgres:postgres 添加到 "services:" ,但这不起作用。我添加了有关上述终端的更多信息 嗨,我的意思是你能从 pgweb 中访问你的 postgres 数据库吗? @Sergiu 链接在 v2+ 撰写文件随附的用户定义网络上不是必需的。 【参考方案1】:

要访问容器中的 postgres,请在容器范围内运行 cli

docker-compose run postgres psql

您还可以连接到尚未在现有配置中发布的容器发布端口。

  postgres:
    build:
      context: .
      dockerfile: ./compose/production/postgres/Dockerfile
    volumes:
      - postgres_data_local:/var/lib/postgresql/data
      - postgres_backup_local:/backups
    ports:
      - '5433:5432'
    environment:
      - POSTGRES_USER=vicki

然后连接到您发布的端口

psql -h localhost -p 5433

【讨论】:

非常感谢马特!这就是我需要的,连接到容器中的数据库 最后一个问题,如何连接到 pgweb?我可以在我正在运行的容器中看到它实际上正在运行,但是当我在 Internet 浏览器中访问 URL 时:localhost:8081 我收到一个错误页面。 我正在尝试运行 pgweb,到目前为止,我已尝试运行此命令“docker-compose -f local.yml run pgweb --url postgres://postgres:postgres@postgres: 5432/postgres " 但是我得到一个 oci 运行时错误 我认为数据库 url 应该类似于 DATABASE_URL=postgres://vicki:somepass@postgres:5432/somedb 但 oci 错误是一个错误的命令。

以上是关于如何在 docker-compose 中访问 Postgres 数据库的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Nginx 反向代理到本地托管(在具有 ssh 访问权限的服务器上)docker-compose

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

使用 ssh 从 Gitlab CI 在远程主机上运行 docker-compose

使用 docker-compose 启动 Postgres 会立即关闭

如何从docker compose文件中访问env变量

在 docker-compose 中访问 GRPC 服务