conexión local docker postgres pgadmin

96

He creado una imagen de ubuntu con nginx, php y postgres.

Quiero conectar la base de datos de postgres en mi imagen actual pgadminubicada en mi máquina local.

Intenté usar el inspector de docker para intentar usar la ip de la imagen para hacer una conexión con mi pgadmin local, pero sin mucho éxito. También intenté configurar algunos puertos en local para que la conexión funcione.

Rigoxls
fuente
No dice si PostgreSQL está escuchando conexiones externas (verifique sus archivos de configuración) o si ese puerto parece abierto desde la máquina local.
Richard Huxton
1
No parece posible responder esa pregunta con tan poca información proporcionada
cthulhu

Respuestas:

91

Es una pregunta válida, no sé por qué la gente siente que "no parece posible responder a esa pregunta".

Entonces, así es como hago lo que estás tratando de hacer:

  1. Extraiga la imagen de postgres de Docker Hub

    docker pull postgres:latest

  2. Ejecute el contenedor usando el siguiente comando

    docker run -p 5432:5432 postgres

  3. Usando el comando de inspección de Docker, encuentre la IP

  4. Use esa IP, PUERTO, nombre de usuario y contraseña para conectarse en PGADMIN

  5. También puede hacer un telnet simple como a continuación para confirmar si puede acceder al contenedor de docker postgres:

    telnet IP_ADDRESS 5432

apilar.
fuente
16
Si está publicando el puerto con esto, -p 5432:5432entonces no necesita encontrar la IP del contenedor, puede usar su IP de host, 127.0.0.1o simplementelocalhost
Davos
La intención de la publicación es válida pero no es una publicación de alta calidad para SE. Para empezar, no se plantea una "pregunta" real. Además, no hay indicios de cómo probaron el proceso o errores que recibieron mientras lo hacían. Dicho esto, creo que ha hecho un buen trabajo respondiendo.
duct_tape_coder
3
Esta respuesta me es útil, por lo tanto, es una pregunta válida.
Todd
He usado -p 5432: 5432 para mapear el contenedor a mi host pero sigo recibiendo un error de conexión. Intenté usar la dirección IP que obtuve de Docker Inspect y funciona.
ginad
49

Lo que hice con éxito en Windows 10 ejecutando Docker para Windows 1.12.6 (9655), el paso es el siguiente:

  1. Extraiga los últimos postgres

    docker pull postgres:latest

  2. ejecuta el contenedor de postgres:

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

  3. Luego instaló la última versión de pgAdmin4 del sitio web pgadmin

  4. Ejecute pgAdmin 4 para crear un nuevo servidor e introduzca el siguiente Host: 127.0.0.1 Puerto: 5432 Nombre de usuario: contraseña de usuario: contraseña123

  5. Entonces todo está bien, conéctese al éxito de la instancia de docker postgres.
Maosheng Wang
fuente
41

Como alternativa, puede combinar Postgres y PgAdmin en un solo docker-composearchivo, y está registrado como usuario [email protected], contraseña: admin. Para agregar el 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
fuente
3
Me sale 'no se pudo traducir el nombre de host "postgres" a la dirección: nodename ni servname proporcionado, o no conocido'.
Enrique Ortiz Casillas
1
no se pudo traducir el nombre de host "postgres" a la dirección: El nombre no se resuelve
proxy
1
si es así docker network ls, verá un puente para la red postgres-to-pgadmin (el mío es postgres_postgres). Luego, puede docker network inspect postgres_postgresver dos contenedores, cada uno con una ip / nombre de host. Tome el de Postgres (el mío es postgres_db_1) para conectarse correctamente desde pgAdmin.
Nulo
25

Esto es lo que hice

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

Cadena de conexión para pgadmin

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

¡¡¡¡¡Funciona bien!!!!!

Thavaprakash Swaminathan
fuente
5
Unable to connect to server: could not translate host name "host.docker.internal" to address: Try again
duct_tape_coder
2
También utilicé este enfoque para crear postgres y pgAdmin en la ventana acoplable. Lo que funcionó para mí como valor de entrada fue la respuesta de @SolidSnake - stackoverflow.com/a/58224344/4288961 > docker inspect CONTAINER_ID | grep IPAddress. y usé esta dirección IP de resultado como host
Prusdrum
¡Increíble!. Muy útil. Solo necesitaba el valor 'host.docker.internal'
Hernán Acosta
19

En mi caso pude resolver el problema inspeccionando mi imagen postgre a través del comando

docker inspect CONTAINER_ID  | grep IPAddress.

Entonces, usé la dirección IP de la ventana acoplable para configurar mi conexión pgadmin 4 y todo estuvo bien. Gracias a @Afshin Ghazi

SolidSnake
fuente
Esto funciona para mi.
Kalpesh Tawde
17

Si pgAdmin está destinado a ejecutarse con el mismo host / invitado de Ubuntu, entonces debe vincular el contenedor de postgres, para que pueda resolverse por un nombre.

1. Ejecute un contenedor de postgres:

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

2. Ejecute el contenedor pgAdmin:

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

3. Ahora, cuando agregue un nuevo servidor en la aplicación web phAdmin, use some-postgrescomo nombre de servidor

Tenga en cuenta el --link some-postgrescuando estábamos abriendo el pgAdmin. Este comando hace que el contenedor de postgres sea visible para el contenedor pgAdmin.

Aleksandr Makov
fuente
1
Puedo conectarme con psq al servidor y accedo a la interfaz pgadmin. Pero, ¿qué red / puerto utilizo cuando me conecto al servidor de postgres desde la interfaz pgadmin?
Tom
1
Vale la pena señalar de los documentos de 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.Tampoco tuve suerte con el uso --linkpara que mi contenedor pgadmin se comunicara con mi contenedor de postgres. Sin embargo, puedo acceder a postgres desde una instalación local de pgadmin.
duct_tape_coder
11

Incluí esto en el archivo docker yaml para obtener la base de datos y 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

El nombre de usuario de postgres es alphaone y la contraseña es xxxxxxxxxxx.

Haz una docker pspara obtener la identificación del contenedor y luegodocker inspect <dockerContainerId> | grep IPAddress

p.ej: docker inspect 2f50fabe8a87 | grep IPAddress

Inserte la dirección IP en pgAdmin y las credenciales de la base de datos utilizadas en la ventana acoplable:

pgAdmin

Afshin Ghazi
fuente
1
Esto ayudó. Tuve que seleccionar la dirección IP correcta desde el contenedor asociado con la ventana acoplable Postgres para agregarla a la configuración del servidor en el portal acoplable PgAdmin como se muestra arriba. Poner localhostno funcionó.
Andrew Lobban
5

En mi caso, tenía un contenedor de PostgreSQL, por lo que no cambié mi contenedor ni creé un enfoque de docker-compose, necesitaba pgadming después de unos meses para haber instalado PostgreSQL, así que este es mi enfoque:

  1. docker inspect my_container_id_postgreSQL
  2. La red asignada a PostgreSQL fue:

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

  3. Ejecuté mi PGADMIN con --networkcomando.

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

  4. Inserte la dirección IP en pgAdmin y las credenciales de la base de datos utilizadas en la ventana acoplable.

Espero que esto pueda ser de utilidad para alguien. Saludos.

Hizmarck
fuente
4

Tienes que exponer el puerto de postgres en el contenedor a tu sistema local. Haz esto ejecutando tu contenedor de esta manera:

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

cuando se conecte con su cliente GUI o CLI, asegúrese de usar la dirección IP, no el host local, incluso si su dirección IP es la dirección IP del host local.

docker ps le daría la dirección IP en la que se encuentra su contenedor de postgres.

meij
fuente
4

Si verificó que PostgreSQL se está ejecutando y puede conectarse allí con una copia local de PgAdmin ...

La respuesta es simple: use host.docker.internalis en lugar de localhostpara el PgAdmin que se ejecuta dentro de Docker

use <code> host.docker.internal </code> en lugar de <code> localhost </code>

KARPOLAN
fuente
2

También puede crear una red de puente Docker para hacer esto.

$ 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. Haga clic en Agregar nuevo servidor
  2. Crear - Servidor
    1. Nombre: db
    2. Nombre de host / dirección: pág.
    3. Nombre de usuario: postgres
    4. Contraseña: pg123
  3. Salvar

El nombre de host / dirección utilizada anteriormente es el nombre del contenedor de Postgres proporcionado por --name pg

Everett Toews
fuente
Este es un enfoque único, que utiliza el nombre del contenedor como nombre de host. El mismo enfoque que configurar Nginx o algo así. Tiene sentido.
Sean McCarthy
2

Después de enfrentar este problema durante dos días, pude resolverlo.

la solución de este problema ya es respondida por personas como inspeccionar

docker inspect CONTAINER_ID

pero mientras ejecutaba este comando obtuve una gran cantidad de registros como la configuración de red de la configuración del host, etc., así que me confundí qué dirección IP agregar en la conexión pgAdmin porque probé 0.0.0.0 y config, host, networkSettings diferente -2 IPAddress en el registros, pero finalmente funciona después de intentarlo mucho.

funciona con qué IP, tenemos que agregar esa dirección IP de red (que creamos para conectar el postgres y pgAdmin .)

como en mi caso cuando corro: -

Docker inspeccionar 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": "",

así que tenemos que agregar NetworkSettings -> Red -> Postgres (red creada por la mía) -> IPAddress, es decir, "IPAddress": "192.168.16.2".

Después de agregar esta ip, funcionará.

Espero que te ayude.

Soleado goel
fuente
1

Para encontrar la ip correcta para su contenedor, ejecute los siguientes comandos:

Verifique la identificación del contenedor:

docker ps

Para comprobar la IP correcta de su contenedor:

docker inspect <ID_CONTAINER> | grep "IPAddress"

La configuración de PostgreSQL y PgAdmin con Docker es simple, si no es correcta, recomiendo rehacer la configuración desde cero, si su problema es más profundo.

Aquí hay un script que desarrollé para resolver este problema. script-sh / install-docker-postgres-y-pgadmin

Rafael Paes Leme
fuente
1

Para macOS, las IP de postgresy pgadmin4son diferentes a las docker inspectproporcionadas. Tipo

docker-machine ls

Eche un vistazo al nombre del servidor a la izquierda. Es defaultpor defecto.

docker-machine ip defaultserá la IP que necesita utilizar para ambos , pgadmin4en el navegador y postgresen la pgadmin4configuración.

Andrei Konstantinov
fuente