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?
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?
Respostas:
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.
ifconfig -u | grep 'inet ' | grep -v 127.0.0.1 | cut -d\ -f2 | head -1
docker run --net=host --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword -d -p 5432:5432 postgres
Eu consegui rodar no linux
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
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
sudo
para executar seu contêiner.
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
su postgres
faz?
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
-e POSTGRES_DB=my-db
para criar my-db em vez de postgres
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.
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
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.
/var/lib/mysql
:?
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 compsql
comandos 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 comopgadmin
oudbeaver
e digite o abaixo nos campos de conexão:
Host: localhost
Database: test
User: postgres
Password: password
Etapa 8 : insira a consultaselect * from test_table
no editor de consultas e você poderá ver a saída123
Por algum motivo, a porta 5432 parece protegida. Alterei minha configuração da porta de 5432:5432
para 5416:5432
e 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>
postgres
serviç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.
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>
No caso, é uma aplicação back-end django, você pode fazer algo assim.
docker exec -it container_id python manage.py dbshell
docker ps -a
para obter IDs de contêiner e, em seguida, docker exec -it psql -U -W
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.