Conectando-se ao Postgresql em um contêiner de docker de fora

197

Eu tenho o Postgresql em um servidor em um contêiner de docker. Como posso me conectar a ele de fora, ou seja, do meu computador local? Que configuração devo aplicar para permitir isso?

Sojo
fonte
1
qual comando você usou para iniciar o postresql? você é capaz de expor uma porta e mapeá-la
lvthillo
Consulte este reachmnadeem.wordpress.com/2020/06/02/…
craftsmannadeem

Respostas:

313

Você pode executar o Postgres desta maneira (mapeie uma porta):

docker run --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword -d -p 5432:5432 postgres

Então agora você mapeou a porta 5432 do seu contêiner para a porta 5432 do seu servidor. -p <host_port>:<container_port> .Então, agora o seu postgres está acessível a partir do seupublic-server-ip:5432

Para testar: Execute o banco de dados postgres (comando acima)

docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                     NAMES
05b3a3471f6f        postgres            "/docker-entrypoint.s"   1 seconds ago       Up 1 seconds        0.0.0.0:5432->5432/tcp    some-postgres

Vá para dentro do seu contêiner e crie um banco de dados:

docker exec -it 05b3a3471f6f bash
root@05b3a3471f6f:/# psql -U postgres
postgres-# CREATE DATABASE mytest;
postgres-# \q

Vá para o seu host local (onde você tem alguma ferramenta ou o cliente psql).

psql -h public-ip-server -p 5432 -U postgres

(senha mysecretpassword)

postgres=# \l

                             List of databases
   Name    |  Owner   | Encoding |  Collate   |   Ctype    |   Access privileges
-----------+----------+----------+------------+------------+-----------------------
 mytest    | postgres | UTF8     | en_US.utf8 | en_US.utf8 |
 postgres  | postgres | UTF8     | en_US.utf8 | en_US.utf8 |
 template0 | postgres | UTF8     | en_US.utf8 | en_US.utf8 | =c/postgres   

Então, você está acessando o banco de dados (que está sendo executado na janela de encaixe em um servidor) a partir do seu host local.

Em este post é expained em detalhe.

lvthillo
fonte
1
@Tjorriemorrie Você tem certeza que o seu postgres está rodando na sua máquina local? Talvez tente 127.0.0.1 em vez de localhost, mas, para conhecê-lo, está funcionando.
Lvthillo
2
Obtenha seu endereço IP público (osx):ifconfig -u | grep 'inet ' | grep -v 127.0.0.1 | cut -d\ -f2 | head -1
Paul
4
De todas as várias postagens relacionadas ao postgres / docker, achei que essa é uma das mais úteis. Obrigado.
rg88
1
@GarouDan se você não quer mapear uma porta, mas ainda quero acessar o contêiner postgres de seu anfitrião você precisa implantar seu recipiente na rede de acolhimento assim:docker run --net=host --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword -d -p 5432:5432 postgres
lvthillo
1
sair obras psql com \ q (apenas para os novatos como eu)
Dirk Schumacher
39

Eu consegui rodar no linux

  1. execute o docker postgres - verifique se a porta está publicada, eu uso o alpine porque é leve.

    sudo docker run --rm -P -p 127.0.0.1:5432:5432 -e POSTGRES_PASSWORD="1234" --name pg postgres:alpine

  2. usando outro terminal, acesse o banco de dados do host usando o postgres uri

    psql postgresql://postgres:1234@localhost:5432/postgres

para usuários de mac, substitua psql por pgcli

Thomas Webber
fonte
7
feliz que alguém respondeu como se conectar sem pular no recipiente. thnx.
PabTorre
1
Você realmente não deve usar sudopara executar seu contêiner.
Russ Bateman
29

Você também pode acessar através do comando docker exec:

$ docker exec -it postgres-container bash

# su postgres

$ psql

Ou

$ docker exec -it postgres-container psql -U postgres
Super Nova
fonte
3
psql -U postgres
Maryna Krasnova 1/11/18
isso é um comentário surpreendentemente útil
Dan Rosenstark
O que su postgresfaz?
Breno
14

Eu já estava executando o postgres na máquina host e não queria permitir conexões da rede, então executei a instância temporária do postgres no contêiner e criei o banco de dados em apenas duas linhas:

# Run PostgreSQL
docker run --name postgres-container -e POSTGRES_PASSWORD=password -it -p 5433:5432 postgres

# Create database
docker exec -it postgres-container createdb -U postgres my-db
Eugene
fonte
se você deseja criar um único banco de dados padrão, também pode adicionar: -e POSTGRES_DB=my-dbpara criar my-db em vez de postgres
framp
13

Estou usando o django com postgres em contêineres do Docker. no arquivo docker-compose, adicione o seguinte:

db:
    image: postgres:10-alpine
    environment:
        - POSTGRES_DB=app
        - POSTGRES_USER=postgres
        - POSTGRES_PASSWORD=supersecretpassword
    **ports:
        - "6543:5432"**

que adicionará uma porta acessível pela sua máquina local. para mim, conectei o DBeaver a ele. isso evitará conflitos de porta entre sua solicitação de aplicativo e a máquina local. no início, recebi uma mensagem dizendo que a porta 5432 está em uso (que é pelo aplicativo django), então não pude acessar pelo pgAdmin ou DBeaver.

omeraiman
fonte
1
Eu achei que isso era o mais útil. Para as pessoas que usam o docker-composit, esse parece ser o melhor caminho a percorrer.
David Frick
Obrigado David, feliz codificação!
omeraiman 5/04
9

Para se conectar a partir do host local, você precisa adicionar '--net host':

docker run --name some-postgres --net host -e POSTGRES_PASSWORD=mysecretpassword -d -p 5432:5432 postgres

Você pode acessar o servidor diretamente sem usar o exec do seu host local, usando:

psql -h localhost -p 5432 -U postgres
user2627846
fonte
6

Tentei conectar-me do localhost (mac) a um contêiner do postgres. Alterei a porta no arquivo docker-compose de 5432 para 3306 e iniciei o contêiner. Não faço ideia por que fiz isso: |

Tentei conectar-me ao postgres via PSequel e adminer e a conexão não pôde ser estabelecida.

Depois de voltar à porta 5432, tudo funciona bem.

  db:
    image: postgres
    ports:
      - 5432:5432
    restart: always
    volumes:
      - "db_sql:/var/lib/mysql"
    environment:
      POSTGRES_USER: root
      POSTGRES_PASSWORD: password
      POSTGRES_DB: postgres_db

Esta foi a minha experiência que eu queria compartilhar. Talvez alguém possa fazer uso disso.

Martin
fonte
3
Caminho do volume /var/lib/mysql:?
David Tabernero M.
5432 é a porta padrão do Postgres. 3306 é a porta padrão do MySQL. Se você alterar a porta publicada em docker-compose, qualquer ferramenta cliente que você tentar usar para conectar-se também usará como padrão a tentativa de conectar-se à porta 5432, a menos que você peça para usar outra porta.
Davos
6

Suponho que você queira visualizar os dados presentes no seu contêiner toda vez que se conectar a ele de fora. Para fazer isso, você terá que manter os dados na imagem do postgres.

Se você não possui dados persistentes, precisará repetir tudo o que fez na primeira vez.
Etapas 3, 5, 6, 7 e 8 respondem à sua pergunta diretamente.

Aqui está a visão geral detalhada de todo o processo que segui no PowerShell do Windows 10 (os comandos são os mesmos no Linux e no macOS):

Etapa 1 : iniciar o PowerShell no modo não administrador

Etapa 2 : faça o download da imagem do docker postgres:
docker pull postgres:latest

Etapa 3 : Inicie o contêiner do docker no modo desanexado e persista os dados na imagem do postgres criando um volume e vinculando-o a um destino
( Nota : por padrão 5432 é a porta padrão usada; mas declare-o explicitamente para evitar erros de conexão de clientes como pgadmin, dbeaver etc.)
docker run --name postgres-test -e POSTGRES_PASSWORD=password -p 5432:5432 -v postgres-data:/var/lib/postgresql/data -d postgres:latest

Etapa 4 : verificar o status dos contêineres em execução
docker ps -a

Etapa 5 : Entre no container_name no modo interativo
( Nota : comandos como ls, pwd etc. podem ser executados aqui se você tiver verificado os contêineres linux durante a instalação)
docker exec -it postgres-test psql -U postgres

Etapa 6 : Crie dados de amostra. Neste ponto, você pode jogar compsqlcomandos da seguinte maneira:

# CREATE DATABASE test;
# \c test
# CREATE TABLE test_table(something int);
# INSERT INTO test_table VALUES (123);
# SELECT * FROM test_table;
# \q

Etapa 7 : Abra um aplicativo cliente de banco de dados comopgadminoudbeavere digite o abaixo nos campos de conexão:

Host: localhost
Database: test
User: postgres
Password: password

Etapa 8 : insira a consultaselect * from test_tableno editor de consultas e você poderá ver a saída123


fonte
5

Por algum motivo, a porta 5432 parece protegida. Alterei minha configuração da porta de 5432:5432para 5416:5432e o seguinte comando funcionou para conectar-se ao banco de dados do postgres de fora do contêiner do docker :

psql -h localhost -p 5416 -U <my-user> -d <my-database>
Marc Perrin-Pelletier
fonte
Funciona para mim, mas não encontrei uma explicação na Internet. Você achou?
negas 12/09/19
2
@negas Você provavelmente já está executando o postgresserviço em sua máquina host, que já se ligará ao localhost: 5432, impedindo que você o utilize. Mapear uma porta de host diferente para a porta padrão 5432 dentro do contêiner é uma boa solução para isso; Como alternativa, você pode interromper o serviço postgres em seu host, mas talvez ele seja usado para algo que você precisa.
Davos
5

primeiro abra a imagem do docker para o postgres

docker exec -it <container_name>

então você obterá a raiz - root@868594e88b53:/# ele precisa da conexão com o banco de dados

psql postgresql://<username>:<databasepassword>@postgres:5432/<database>
ashutosh gupta
fonte
1

No caso, é uma aplicação back-end django, você pode fazer algo assim.

docker exec -it container_id python manage.py dbshell
Super Nova
fonte
1

Há boas respostas aqui, mas Se você deseja ter alguma interface para o gerenciamento do banco de dados do postgres, pode instalar o pgAdmin no computador local e conectar-se à máquina remota usando seu IP e a porta exposta do postgres (por padrão 5432).

CageE
fonte
0

docker ps -a para obter IDs de contêiner e, em seguida, docker exec -it psql -U -W

Afshin Ghazi
fonte
-1

Sei que é tarde, se você usasse o docker-compose como @Martin

Estes são os trechos que me ajudaram a conectar ao psql dentro do contêiner

docker-compose run db bash

root@de96f9358b70:/# psql -h db -U root -d postgres_db

Não posso comentar porque não tenho 50 reputação. Então, espero que isso ajude.

Rishabh Anand
fonte
Op quer se conectar de fora.
avizzzy