conexão local docker postgres pgadmin

100

Eu criei uma imagem do ubuntu com nginx, php e postgres.

Quero conectar o banco de dados postgres em minha imagem atual com pgadminlocalizado em minha máquina local.

Tentei usar o docker inspector para tentar usar o ip da imagem para fazer uma conexão com meu pgadmin local, mas sem muito sucesso. Também tentei configurar algumas portas no local para fazer a conexão funcionar.

Rigoxls
fonte
Você não diz se o PostgreSQL está ouvindo conexões externas (verifique seus arquivos de configuração) ou se essa porta parece aberta na máquina local.
Richard Huxton
1
Não parece possível responder a essa pergunta com tão poucas informações fornecidas
cthulhu

Respostas:

92

É uma pergunta válida não saber por que as pessoas sentem "não parece possível responder a essa pergunta".

Então, eis como faço o que você está tentando fazer:

  1. Puxe a imagem do postgres do Docker Hub

    docker pull postgres:latest

  2. Execute o contêiner usando o comando abaixo

    docker run -p 5432:5432 postgres

  3. Usando o comando de inspeção do docker, encontre o IP

  4. Use esse IP, PORTA, nome de usuário e senha para se conectar em PGADMIN

  5. Você também pode fazer um telnet simples como abaixo para confirmar se você pode acessar o contêiner docker postgres:

    telnet IP_ADDRESS 5432

stack.it
fonte
16
Se você estiver publicando a porta com isso -p 5432:5432, você não precisa encontrar o IP do contêiner, você pode usar o IP do seu host, ou 127.0.0.1ou apenaslocalhost
Davos
A intenção da postagem é válida, mas não é uma postagem de alta qualidade para SE. Para começar, não há nenhuma 'questão' real colocada. Além disso, não há indicações de como eles tentaram o processo ou erros que receberam ao fazê-lo. Dito isso, acho que você fez um bom trabalho de resposta.
duct_tape_coder
3
Essa resposta é útil para mim, portanto é uma pergunta válida.
Todd
Usei -p 5432: 5432 para mapear o contêiner para meu host, mas ainda estou recebendo um erro de conexão. Tentei usar o IPAddress que obtive no docker inspect e funcionou.
ginad
50

O que eu fiz com sucesso no windows 10 executando o docker para windows 1.12.6 (9655), a etapa é como abaixo:

  1. Puxe o último postgres

    docker pull postgres:latest

  2. execute o contêiner postgres:

    docker run -d -e POSTGRES_USER=user -e POSTGRES_PASSWORD=password123 --name db-my -p 5432:5432 --restart=always postgres

  3. Em seguida, instalei a última versão do pgAdmin4 do site pgadmin

  4. Execute pgAdmin 4, crie um novo servidor e insira o seguinte Host: 127.0.0.1 Porta: 5432 Nome de usuário: senha de usuário: senha123

  5. Então está tudo ok, conecte-se ao sucesso da instância docker postgres.
Maosheng Wang
fonte
45

Alternativamente, você pode combinar Postgres e pgadmin em um docker-composearquivo e faça login como usuário [email protected], pwd: admin. Para adicionar o servidor Posgres, use hostname postgres, port 5432.

version: '3'
services:
  postgres:
    image: postgres
    hostname: postgres
    ports:
      - "6543:5432"
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
      POSTGRES_DB: TEST_SM
    volumes:
      - postgres-data:/var/lib/postgresql/data
    restart: unless-stopped

  pgadmin:
    image: dpage/pgadmin4
    depends_on:
      - postgres
    ports:
      - "5555:80"
    environment:
      PGADMIN_DEFAULT_EMAIL: [email protected]
      PGADMIN_DEFAULT_PASSWORD: admin
    restart: unless-stopped

volumes:
  postgres-data:
Erik Vullings
fonte
3
Recebo 'não foi possível traduzir o nome do host "postgres" para o endereço: nodename nem servname fornecido, ou desconhecido'.
Enrique Ortiz Casillas
1
não foi possível traduzir o nome do host "postgres" para o endereço: Nome não resolve
proxy
2
se você docker network ls, verá uma ponte para a rede postgres-to-pgadmin (a minha é postgres_postgres). Então, você pode docker network inspect postgres_postgresver dois containers, cada um com um ip / hostname. Pegue o do Postgres (o meu é postgres_db_1) para conectar com sucesso a partir do pgAdmin.
Zero,
28

Isso é o que eu fiz

para postgres

docker run -p 5432:5432  --name container-postgresdb -e POSTGRES_PASSWORD=admin -d postgres

para pgadmin

docker run -p 5050:80  -e "[email protected]" -e "PGADMIN_DEFAULT_PASSWORD=admin"  -d dpage/pgadmin4

String de conexão para pgadmin

host: host.docker.internal
database: postgres
user: postgres
password: admin

Funciona bem!!!!!

Thavaprakash Swaminathan
fonte
5
Unable to connect to server: could not translate host name "host.docker.internal" to address: Try again
duct_tape_coder
2
Também usei essa abordagem para criar postgres e pgAdmin no docker. O que funcionou para mim como um valor de entrada foi a resposta de @SolidSnake - stackoverflow.com/a/58224344/4288961 > docker inspect CONTAINER_ID | grep IPAddress. e usou este endereço IP de resultado como um host
Prusdrum
Impressionante!. Muito útil. Eu só precisava do valor 'host.docker.internal'
Hernán Acosta,
20

No meu caso eu poderia resolver o problema de inspecionar minha imagem postgre através do comando

docker inspect CONTAINER_ID  | grep IPAddress.

Então, usei o endereço IP do docker para configurar minha conexão do pgadmin 4 e deu tudo certo. Obrigado a @Afshin Ghazi

SolidSnake
fonte
17

Se o objetivo do pgAdmin for ser executado no mesmo host / convidado do Ubuntu, você precisará vincular o contêiner postgres, para que possa ser resolvido por um nome.

1. Execute um contêiner postgres:

docker run --name some-postgres -e POSTGRES_PASSWORD=postgres -d postgres

2. Execute o contêiner pgAdmin:

docker run -p 80:80 --link some-postgres -e "[email protected]" -e "PGADMIN_DEFAULT_PASSWORD=postgres" -d dpage/pgadmin4

3. Agora, ao adicionar um novo servidor no aplicativo web phAdmin, use some-postgrescomo nome do servidor

Observe --link some-postgresquando estávamos abrindo o pgAdmin. Este comando torna o contêiner postgres visível para o contêiner pgAdmin.

Aleksandr Makov
fonte
1
Posso me conectar com o psq ao servidor e acessar a interface pgadmin. Mas que rede / porta devo usar ao me conectar ao servidor postgres a partir da interface pgadmin?
Tom,
1
Vale a pena observar nos docs do Docker ( docs.docker.com/network/links ) Warning: The --link flag is a legacy feature of Docker. It may eventually be removed. Unless you absolutely need to continue using it, we recommend that you use user-defined networks to facilitate communication between two containers instead of using --link.Eu também não tive sorte --linkem fazer meu contêiner pgadmin falar com meu contêiner postgres. Posso acessar o postgres a partir de uma instalação local do pgadmin.
duct_tape_coder
13

Eu incluí isso no arquivo docker yaml para obter o banco de dados e o pgAdmin:

database:
    image: postgres:10.4-alpine
    container_name: kafka-nodejs-example-database
    environment:
      POSTGRES_USER: ${POSTGRES_USER}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
    expose:
      - "5432"
    ports:
      - 8000:5432
    volumes:
      - ./services/database/schema.sql:/docker-entrypoint-initdb.d/1-schema.sql
      - ./services/database/seed.sql:/docker-entrypoint-initdb.d/2-seed.sql
  pgadmin:
    image: dpage/pgadmin4
    ports:
      - 5454:5454/tcp
    environment:
      - [email protected]
      - PGADMIN_DEFAULT_PASSWORD=postgres
      - PGADMIN_LISTEN_PORT=5454

O nome de usuário do postgres é alphaone e a senha é xxxxxxxxxxx.

Faça um docker pspara obter o id do contêiner e entãodocker inspect <dockerContainerId> | grep IPAddress

por exemplo: docker inspect 2f50fabe8a87 | grep IPAddress

Insira o endereço IP no pgAdmin e as credenciais do banco de dados usadas no docker:

pgAdmin

Afshin Ghazi
fonte
1
Isso ajudou. Eu tive que usar o grep para o endereço IP correto de dentro do contêiner associado ao docker Postgres para adicionar à configuração do servidor no portal docker PgAdmin como mostrado acima. Colocar localhostnão funcionou.
Andrew Lobban
6

Se você verificou que o PostgreSQL está em execução e pode se conectar a ele com uma cópia local do PgAdmin ...

A resposta é simples: use host.docker.internalistead localhostpara o PgAdmin rodando dentro do Docker

use <code> host.docker.internal </code> istead de <code> localhost </code>

KARPOLAN
fonte
5

No meu caso, eu tinha um contêiner PostgreSQL, então não mudei meu contêiner ou criei uma abordagem docker-compose, precisei pgadming depois de alguns meses para instalar o PostgreSQL, então esta é minha abordagem:

  1. docker inspect my_container_id_postgreSQL
  2. A rede atribuída ao PostgreSQL foi:

    "Redes": {"docker_default": {"IPAddress": "172.18.0.2", ...}}

  3. Executei meu PGADMIN com --networkcomando.

    docker run -p 85:80 --network docker_default -e '[email protected]' -e 'PGADMIN_DEFAULT_PASSWORD = SuperSecret' -d dpage / pgadmin4

  4. Insira o endereço IP no pgAdmin e as credenciais do banco de dados usadas no docker.

Espero que isso possa ser útil para alguém. Saudações.

Hizmarck
fonte
4

Você deve expor a porta do postgres no contêiner para seu sistema local. Você faz isso executando seu contêiner assim:

docker run -p 5432:5432 <name/id of container>

ao conectar-se com seu cliente GUI ou CLI, certifique-se de usar o endereço IP, não o localhost, mesmo se o seu endereço IP for o endereço IP do host local.

docker ps fornecerá o endereço IP em que seu contêiner do postgres está.

meij
fonte
4

Depois de enfrentar esse problema por dois dias, consegui resolvê-lo.

solução deste problema já é respondida por pessoas como do inspecionar

docker inspect CONTAINER_ID

mas, ao executar este comando, obtive muitos logs como Host Config Config Network Settings etc., então fiquei confuso qual endereço IP adicionar na conexão pgAdmin porque tentei 0.0.0.0 e config, host, networkSettings diferente -2 IPAddress no logs, mas finalmente funciona depois de tentar muito.

ele funciona com qual IP, temos que adicionar esse endereço IP de rede (que criamos para conectar o postgres e o pgAdmin .)

como no meu caso quando corro: -

docker inspect postgres_container

 "NetworkSettings": {
        "Bridge": "",
        "SandboxID": "sdffsffsfsfsfsf123232e2r3pru3ouoyoyuosyvo8769696796",
        "HairpinMode": false,
        "LinkLocalIPv6Address": "",
        "LinkLocalIPv6PrefixLen": 0,
        "Ports": {
            "5432/tcp": [
                {
                    "HostIp": "0.0.0.0",
                    "HostPort": "5432"
                }
            ]
        },
        "SandboxKey": "/var/run/docker/231231Ad132",
        "SecondaryIPAddresses": null,
        "SecondaryIPv6Addresses": null,
        "EndpointID": "",
        "Gateway": "",
        "GlobalIPv6Address": "",
        "GlobalIPv6PrefixLen": 0,
        "IPAddress": "",
        "IPPrefixLen": 0,
        "IPv6Gateway": "",
        "MacAddress": "",
        "Networks": {
            "postgres": {
                "IPAMConfig": null,
                "Links": null,
                "Aliases": [
                    "postgres",
                    "0e2j3bn2m42"
                ],
                "NetworkID": "35rhlhl3l53l5hlh3523233k3k4k22l3hk2k4",
                "EndpointID":"b3424n43k52o2i4n235k1k4l2l4hj234f14n2",
                "Gateway": "192.168.16.1",
                "IPAddress": "192.168.16.2",
                "IPPrefixLen": 20,
                "IPv6Gateway": "",

então temos que adicionar NetworkSettings -> Rede -> Postgres (rede criada pela mina) -> IPAddress, ou seja, "IPAddress": "192.168.16.2".

Depois de adicionar esse ip ele vai funcionar.

Eu espero que isso ajude.

Sunny Goel
fonte
2

Você também pode criar uma rede de ponte Docker para fazer isso.

$ docker network create pgnet
a0ae44aaf6f806fc37302e4c603b4828c4edb8d487fd9cd90e2fb19ae1d5c65f

$ docker run --detach \
    --name pg \
    --network pgnet \
    --publish 5432:5432 \
    --restart always \
    --env POSTGRES_PASSWORD=pg123 \
    --volume ${PWD}/data:/var/lib/postgresql/data \
    postgres:12.1
b60611e43727dabe483c1f08fdf74961b886ce05b432a10a0625bd1b6db87899

$ docker run --detach \
    --name pgadm \
    --network pgnet \
    --publish 8000:80 \
    --volume ${PWD}/pgadmin:/var/lib/pgadmin \
    --env [email protected] \
    --env PGADMIN_DEFAULT_PASSWORD=pgadm123 \
    dpage/pgadmin4:4.20
27f9ce1c1c4c383ee1507f4e2d88f6ef33d4fcf5b209a8a03b87519f90d56312

Abra http: // localhost: 8000 /

  1. Clique em Adicionar Novo Servidor
  2. Criar - Servidor
    1. Nome: db
    2. Nome do host / endereço: pg
    3. Nome de usuário: postgres
    4. Senha: pg123
  3. Salve 

O nome do host / endereço usado acima é o nome do container Postgres dado por --name pg

Everett Toews
fonte
Esta é uma abordagem única, usando o nome do contêiner como o nome do host. Mesma abordagem da configuração do Nginx ou algo assim. Faz sentido.
Sean McCarthy
1

Para encontrar o ip correto para seu contêiner, execute os seguintes comandos:

Verifique o ID do contêiner:

docker ps

Para verificar o IP correto do seu contêiner:

docker inspect <ID_CONTAINER> | grep "IPAddress"

A configuração do PostgreSQL e do PgAdmin com Docker é simples, se não estiver correta, recomendo refazer a configuração do zero, se o seu problema for mais profundo.

Aqui está um script que desenvolvi para resolver esse problema. script-sh / install-docker-postgres-and-pgadmin

Rafael Paes Leme
fonte
1

Para macOS, os IPs de postgrese pgadmin4são diferentes dos docker inspectfornecidos. Tipo

docker-machine ls

Dê uma olhada no nome do servidor à esquerda. É defaultpor padrão.

docker-machine ip defaultserá o IP que você precisa usar para ambos , pgadmin4no navegador e postgresnas pgadmin4configurações.

Andrei Konstantinov
fonte
0

A solução que experimentei e funcionou para mim foi criar um arquivo docker compose onde incluí postgress e pgadmin como serviços. Para mais detalhes: Conectando o pgadmin ao postgres no docker

Andrei Bacescu
fonte