在Docker中将pgAdmin连接到PostgreSQL

7

我有一个包含pythonnginxpostgrespgadmin服务的docker-compose文件:

services:
  postgres:
    image: postgres:9.6
    env_file: .env
    volumes:
      - postgres_data:/var/lib/postgresql/data
    ports:
      - "5431:5431"

  pgadmin:
    image: dpage/pgadmin4
    links:
      - postgres
    depends_on:
      - postgres
    environment:
      PGADMIN_DEFAULT_EMAIL: admin@admin.com
      PGADMIN_DEFAULT_PASSWORD: pwdpwd
    volumes:
      - pgadmin:/root/.pgadmin
    ports:
      - "5050:80"

  backend:
    build:
      context: ./foobar  # This refs a Dockerfile with Python and Django requirements
    command: ["/wait-for-it.sh", "postgres:5431", "--", "/gunicorn.sh"]
    volumes:
      - staticfiles_root:/foobar/static
    depends_on:
      - postgres

  nginx:
    build:
      context: ./foobar/docker/nginx
    volumes:
      - staticfiles_root:/foobar/static
    depends_on:
      - backend
    ports:
      - "0.0.0.0:80:80"

volumes:
  postgres_data:
  staticfiles_root:
  pgadmin:

当我运行docker-compose up并访问localhost:5050时,我会看到pgadmin界面。当我尝试在那里创建一个新的服务器,使用localhost0.0.0.0作为主机名和5431作为端口时,我会收到一个错误“无法连接到服务器”。如果我删除这些内容,而是在“服务”字段中输入postgres,我会收到错误“找不到服务“postgres”的定义”。我如何使用pgadmin连接到数据库?

请注意,Postgres 的默认端口是 5432 而不是 5431。您应该在 compose 文件中更新 Postgres 服务的端口映射。错误的端口可能是您报告的问题的原因。更改端口映射,然后尝试连接到 postgres:5432。localhost:5432 将无法工作。 - Ciprian Stoica
@CiprianStoica 那个方法可行,谢谢!如果您将它添加为答案,我会标记它为正确的。 - GluePear
我很高兴它有帮助。我刚把它添加为一个答案。 :-) - Ciprian Stoica
2个回答

7
在使用docker-compose时,为了保持容器名称的唯一性,容器名称会更改为文件夹名称的前缀。你可以使用container_name属性来强制指定容器的名称。
version: "3"
services:

  # postgres database
  postgres:
    image: postgres:12.3
    container_name: postgres
    environment:
      - POSTGRES_DB=admin
      - POSTGRES_USER=admin
      - POSTGRES_PASSWORD=admin
      - POSTGRES_HOST_AUTH_METHOD=trust # allow all connections without a password. This is *not* recommended for prod
    volumes:
      - database-data:/var/lib/postgresql/data/ # persist data even if container shuts down
    ports:
      - "5432:5432"

  # pgadmin for managing postgis db (runs at localhost:5050)
  # To add the above postgres server to pgadmin, use hostname as defined by docker: 'postgres'
  pgadmin:
    image: dpage/pgadmin4
    container_name: pgadmin
    environment:
      - PGADMIN_DEFAULT_EMAIL=admin
      - PGADMIN_DEFAULT_PASSWORD=admin
      - PGADMIN_LISTEN_PORT=5050
    ports:
      - "5050:5050"
  
volumes:
  database-data:

另一种选择是使用以下方式将postgres容器连接到本地主机:

network_mode: host

但这样会失去docker提供的良好网络隔离功能。


4

请注意,Postgres的默认端口是5432而不是5431。您应该在compose文件中更新postgres服务的端口映射。错误的端口可能是您报告问题的原因。更改端口映射,然后尝试连接到postgres:5432。localhost:5432将无法工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接