Conexión a Postgresql en un contenedor acoplable desde afuera

197

Tengo Postgresql en un servidor en un contenedor acoplable. ¿Cómo puedo conectarme desde el exterior, es decir, desde mi computadora local? ¿Qué configuración debo aplicar para permitir eso?

Sojo
fuente
1
¿Qué comando usaste para iniciar el postresql? puedes exponer un puerto y
mapearlo
Consulte este reachmnadeem.wordpress.com/2020/06/02/…
craftsmannadeem

Respuestas:

313

Puede ejecutar Postgres de esta manera (mapear un puerto):

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

Así que ahora ha asignado el puerto 5432 de su contenedor al puerto 5432 de su servidor. -p <host_port>:<container_port> .Así que ahora puedes acceder a tus postgres desde tupublic-server-ip:5432

Para probar: Ejecute la base de datos postgres (comando anterior)

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

Entra en tu contenedor y crea una base de datos:

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

Vaya a su localhost (donde tiene alguna herramienta o el cliente psql).

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

(contraseña 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   

Entonces está accediendo a la base de datos (que se ejecuta en Docker en un servidor) desde su host local.

En esta publicación se expande en detalle.

lvthillo
fuente
1
@Tjorriemorrie ¿Estás seguro de que tus postgres se están ejecutando en tu máquina local? Tal vez intente 127.0.0.1 en lugar de localhost, pero para cumplir está funcionando.
lvthillo
2
Obtenga su dirección IP pública (osx):ifconfig -u | grep 'inet ' | grep -v 127.0.0.1 | cut -d\ -f2 | head -1
Paul
44
De todas las publicaciones relacionadas con postgres / docker que he encontrado, esta es una de las más útiles. Gracias.
rg88
1
@GarouDan si no desea asignar un puerto pero aún desea acceder al contenedor de postgres desde su host, deberá implementar su contenedor en la red de host de esta manera:docker run --net=host --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword -d -p 5432:5432 postgres
lvthillo
1
salir de psql funciona con \ q (solo para los novatos como yo)
Dirk Schumacher
39

Me las arreglé para ejecutarlo en Linux

  1. ejecuta el docker postgres: asegúrate de que el puerto esté publicado, yo uso alpine porque es ligero

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

  2. usando otra terminal, acceda a la base de datos desde el host usando la uri de postgres

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

para usuarios de mac, reemplace psql con pgcli

Thomas Webber
fuente
77
Me alegra que alguien haya respondido cómo conectarse sin saltar al contenedor. gracias.
PabTorre
1
Realmente no deberías usar sudopara ejecutar tu contenedor.
Russ Bateman
29

También puede acceder a través del comando docker exec:

$ docker exec -it postgres-container bash

# su postgres

$ psql

O

$ docker exec -it postgres-container psql -U postgres
SuperNova
fuente
3
psql -U postgres
Maryna Krasnova
ese es un comentario sorprendentemente útil
Dan Rosenstark
¿Qué su postgreshacer?
Breno
14

Ya había ejecutado postgres en la máquina host y no quería permitir conexiones desde la red, por lo que ejecuté una instancia temporal de postgres en el contenedor y creé la base de datos en solo dos líneas:

# 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
fuente
si desea crear una única base de datos predeterminada, también puede agregar: -e POSTGRES_DB=my-dbpara crear my-db en lugar de postgres
framp
13

Estoy usando django con postgres en contenedores Docker. en el archivo docker-compose, agregue lo siguiente:

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

que agregará un puerto accesible por su máquina local. Por mi parte, conecté DBeaver a él. Esto evitará conflictos de puertos entre su solicitud de aplicación y la solicitud de la máquina local. Al principio, recibí un mensaje que decía que el puerto 5432 está en uso (que es por la aplicación django), por lo que pgAdmin o DBeaver no pude acceder.

omeraiman
fuente
1
Encontré que esto es lo más útil. Para las personas que usan docker-compose, esta parece ser la mejor manera de hacerlo.
David Frick
¡Gracias David, feliz codificación!
omeraiman
9

Para conectarse desde el host local necesita agregar '--net host':

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

Puede acceder al servidor directamente sin usar exec desde su host local, usando:

psql -h localhost -p 5432 -U postgres
usuario2627846
fuente
6

Intenté conectarme desde localhost (mac) a un contenedor de postgres. Cambié el puerto en el archivo docker-compose de 5432 a 3306 y comencé el contenedor. No tengo idea de por qué lo hice: |

Luego intenté conectarme a postgres a través de PSequel y adminer y la conexión no se pudo establecer.

Después de volver al puerto 5432, todo funciona bien.

  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 fue mi experiencia que quería compartir. Quizás alguien pueda usarlo.

Martín
fuente
3
Ruta de volumen /var/lib/mysql:?
David Tabernero M.
5432 es el puerto predeterminado de Postgres. 3306 es el puerto predeterminado de MySQL. Si cambia el puerto publicado en docker-compose, las herramientas de cliente que intente usar para conectarse también intentarán conectarse al puerto 5432 a menos que les indique que usen otro puerto.
Davos
6

Supongo que desea poder ver los datos presentes en su contenedor cada vez que se conecta desde afuera. Para ello, tendrá que persistir datos de la imagen de postgres sucesivamente.

Si no tiene datos persistentes, deberá repetir todo lo que hizo la primera vez.
Los pasos 3, 5, 6, 7 y 8 responden su pregunta directamente.

Aquí está la descripción detallada de todo el proceso que seguí en Windows 10 Powershell (los comandos también son los mismos en Linux y MacOS):

Paso 1 : Inicie PowerShell en modo no administrativo

Paso 2 : descarga la imagen del acoplador postgres:
docker pull postgres:latest

Paso 3 : Inicie el contenedor acoplable en modo separado y conserve los datos en la imagen de postgres creando un volumen y vinculándolo a un destino
( Nota : 5432 es el puerto predeterminado que se usa de manera predeterminada; pero dígalo explícitamente para evitar errores de conexión 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

Paso 4 : Verifique el estado de los contenedores en ejecución
docker ps -a

Paso 5 : vaya dentro de container_name en modo interactivo
( Nota : los comandos como ls, pwd, etc. se pueden ejecutar aquí si ha verificado los contenedores de Linux durante la instalación)
docker exec -it postgres-test psql -U postgres

Paso 6 : crear datos de muestra. En este punto, puedes jugar conpsqlcomandos de la siguiente manera:

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

Paso 7 : abra una aplicación cliente de base de datos comopgadminodbeavere ingrese lo siguiente en los campos de conexión:

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

Paso 8 : ingrese la consultaselect * from test_tableen el editor de consultas y debería poder ver la salida123


fuente
5

Por alguna razón, el puerto 5432 parece estar protegido. Cambié mi configuración de puerto de 5432:5432a 5416:5432y el siguiente comando funcionó para conectarse a su base de datos postgres desde fuera de su contenedor acoplable :

psql -h localhost -p 5416 -U <my-user> -d <my-database>
Marc Perrin-Pelletier
fuente
A mí me funciona, pero no encontré una explicación en Internet. ¿Encontraste?
negas
2
@negas Probablemente ya esté ejecutando el postgresservicio en su máquina host que ya se unirá a localhost: 5432 evitando que lo use. La asignación de un puerto de host diferente al puerto predeterminado 5432 dentro del contenedor es una buena solución para eso; alternativamente, podría detener el servicio postgres en su host, pero tal vez se use para algo que necesite.
Davos
5

primero abra la imagen acoplable para los postgres

docker exec -it <container_name>

entonces obtendrá la raíz: root@868594e88b53:/# necesita la conexión de la base de datos

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

En caso de que sea una aplicación backend de django, puede hacer algo como esto.

docker exec -it container_id python manage.py dbshell
SuperNova
fuente
1

Aquí hay buenas respuestas, pero si desea tener alguna interfaz para la administración de la base de datos postgres, puede instalar pgAdmin en su computadora local y conectarse a la máquina remota utilizando su IP y el puerto expuesto de postgres (por defecto 5432).

JaulaE
fuente
0

docker ps -a para obtener identificadores de contenedor y luego docker exec -it psql -U -W

Afshin Ghazi
fuente
-1

Sé que es tarde, si usaste docker-compose como @Martin

Estos son los fragmentos que me ayudaron a conectarme a psql dentro del contenedor

docker-compose run db bash

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

No puedo comentar porque no tengo 50 reputación. Espero que esto ayude.

Rishabh Anand
fuente
Op quiere conectarse desde afuera.
avizzzy