Instalar postgresql en docker


En este post vamos a trabajar en la instalación de postgresql sobre una imagen de docker

oscar Escrito por oscar 22 August 2021 9297 1

Contenido

Acerca del proyecto

En este post vamos a trabajar en la instalación de postgresql sobre una imagen de docker, en post pasados se a instalado postgresql en Windows y Linux, como van a encontrar en el conocimiento previo de este post, pero en este caso vamos a hacer la instalación y la configuración desde una imagen docker ya creada para generar nuestra base de datos de forma fácil sin tener que instalar el motor completamente.

Se ha creado un paso a paso desde cómo descargar la imagen necesaria con la versión que necesitemos, crear un volumen para poder almacenar los datos y las base de datos, por último generaremos el usuario y la contraseña de administrador para acceder.

Ya por último vamos a ver cómo acceder a la consola de postgres desde el contenedor que se está ejecutando con la imagen de postresql.

Conocimiento previo

Para realizar este proyecto se requiere conocimiento previo de los siguientes temas, si aun no has trabajado con lo que se menciona en la siguiente tabla, allí están los links a los post para que puedas dar un repaso adicional o puedas recordar el conocimiento necesario para poder realizar este proyecto.

Proyecto Descripción
Introducción postgresql En este post damos la introducción, definición y los temas que trabajaremos con postgresql, ademas estan los links de los post de este tema.
Docker build En este post explicamos como crear una imagen a partir de un archivo dockerfile
Introducción a docker Damos la introducción, definición y los temas principales de docker para poder entender entrono de trabajo con contenedores.
Docker comandos básicos Explicamos los comandos que vamos a usar en este post, ademas damos ejemplos a detalle
dockerfile Realizamos la explicación de archivo con que creamos las imágenes de docker
Volúmenes en docker Realizamos la explicación de los volúmenes en docker, como crearlos, usarlos, leer y escribir datos.

Entrono y programas a instalar

Para este post usamos los siguientes programas:

  • Microsoft Windows [Versión 10.0.19043.1110]
  • Docker version 20.10.7, build f0df350
  • Imagen oficial de postgres 12.6 en docker hub
  • Visual studio code, pero puede usar cualquier editor de texto

Imagen de postgresql

Para este caso usare la imagen de postgres que ya esta creada, depurada, verificada y lista para funcionar, esta la vamos a encontrar en docker hub, como postgres, en este proyecto vamos a usar la versión 12.6, aunque a la fecha de este post ya esta la versión 13 disponible, estoy trabajando con un proyecto que requiere esta versión; igual me sirve para explicar como seleccionar la versión que necesiten.

Docker compose

Compose es una herramienta para definir y ejecutar aplicaciones Docker de varios contenedores. Con Compose, usa un archivo YAML para configurar los servicios de su aplicación. Luego, con un solo comando, crea e inicia todos los servicios desde su configuración.[1]

El siguiente es un ejemplo, pero detallaremos mas adelante cuan ejecutemos el código.

docker-compose up

Crear el proyecto de postgresql con docker

Para crear el proyecto de usar postgresql con docker los explicare paso a paso lo mas detallado posible, para que se pueda entender correctamente.

Directorio ubicación

Vamos a crear una carpeta donde vamos a adicionar él o los archivos de este proyecto, recomiendo que sea una ruta fácil de encontrar y llegar desde la consola de comandos (CMD) ya que la ejecución de docker compose se ejecuta por este medio.

En mi caso creare el directorio o carpeta "docker-postges" en la ubicación C:\code\codigoelectronica\docker-postgres, pero aclaro que pueden usar cualquier ubicación.

Crear archivo docker-compose

Después de tener la carpeta procedemos a crear el archivo principal con el que vamos a trabajar, este archivo lo vamos a nombrar como "docker-compose.yml", debe ser de esta forma ya que el mismo comando lo reconoce con este nombre, se puede nombrar de otra forma pero por el momento no lo trabajaremos de ese modo.

C:\code\codigoelectronica\docker-postgres
----docker-compose.yml

docker-compose.yml

Ahora explicaremos el archivo yml paso a paso, el cual si lo copiamos tal cual deberá funcionar sin ningún problema, creando la imagen y ejecutándola en un contenedor:

Nota: muy importante, los archivos yml y yaml son estrictos con los espacios y la tabulación, cuando cree el archivo fíjese que la tabulación sea a dos puntos o dos espacios.

# Trabajaremos con la versión 3 docker
version: '3'

# Creamos los servicios
services:
  mydb:                                 # Creamos el servicios mydb para identificar la imagen
    image: postgres:12.6                # Usamos la imagen postgresql en la versión 12
    volumes:
      - postgresdb:/var/lib/postgresql  # Crearemos un volumen para almacenar los datos de la db
    ports:                               
      - "5432:5432"                     # Habilitamos el puerto 5432 para acceder a la db
    environment:                        # Creamos las variables del usuario contraseña y base de datos 
      POSTGRES_USER: admin              #   que se crea cuando inicia docker
      POSTGRES_PASSWORD: admin
      POSTGRES_DB: testdb

volumes:                                # Creamos y asignamos el volumen de docker
  postgresdb:
    driver: local

Antes de ejecutar el comando para crear la imagen debemos tener en cuenta lo siguiente:

  1. Se debe crear el volumen con el comando docker volume create postgresdb, sin el volumen genera un error al ejecutarse.
  2. En la selección de la version de la images se observa que usamos la 12.6, pero podemos también la que necesitemos en nuestro proyecto como la 13 o latest que seria la ultima estable para trabajar.

Ejecutar el comando docker-compose

Después de tener el archivo docker-compose.yml listo procedemos a generar la images y crear el contenedor que va a iniciar y ejecutar postgresql, para elló usamos el comando docker-compose el cual se encargara de crear la imagen y correrla en un contenedor.

Para ejecutar docker compose abrimos la terminal de comandos (CMD) y nos ubicamos en el directorio donde esta el archivo con el mismo nombre, donde vamos a escribir el siguiente comando:

c:\code\codigoelectronica\docker-postgres>docker-compose up -d

Ahora vamos a explicar la respuesta del comando, primero va a descargar la imagen de postgesql a nustra maquina local

Pulling mydb (postgres:12.6)...
12.6: Pulling from library/postgres
69692152171a: Pull complete
a31b993d5cc6: Pull complete
...
44248978f8ed: Pull complete
c74c1c4f5ca3: Pull complete
83addcc511dd: Pull complete
478b899f4ef8: Pull complete
Digest: sha256:26ce5e265fbbf120b4a89a9b26770bad757a7dfa4f329038d93770edbe5aae00
Status: Downloaded newer image for postgres:12.6

Luego procederá a crear el contenedor con la imagen postgresql descargada, liego va a iniciar la base de datos donde emprezara a cargar los archivos necesarios, su configuración, habilitara los puertos de comunicación y cargara las db que tenga almacenadas

Creating docker-postgres_mydb_1 ... done
Attaching to docker-postgres_mydb_1
mydb_1  | The files belonging to this database system will be owned by user "postgres".
mydb_1  | This user must also own the server process.

Cuando se finalice la ejecución, al finalizar mostrara los últimos logs donde indicara en que puesto esta disponible para realizar la comunicación y el mensaje de que la base de datos esta disponible para usar.

mydb_1  | 2021-08-22 15:47:18.568 UTC [1] LOG:  starting PostgreSQL 12.6 (Debian 12.6-1.pgdg100+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 8.3.0-6) 8.3.0, 64-bit
mydb_1  | 2021-08-22 15:47:18.568 UTC [1] LOG:  listening on IPv4 address "0.0.0.0", port 5432
mydb_1  | 2021-08-22 15:47:18.568 UTC [1] LOG:  listening on IPv6 address "::", port 5432
mydb_1  | 2021-08-22 15:47:18.571 UTC [1] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
mydb_1  | 2021-08-22 15:47:18.579 UTC [76] LOG:  database system was shut down at 2021-08-22 15:47:18 UTC
mydb_1  | 2021-08-22 15:47:18.582 UTC [1] LOG:  database system is ready to accept connections

Acceder a la consola postgresql desde docker

Este es un paso opcional ya que si queremos comprobar la versión de postgresql instalada o trabajar desde la consola de postgres, para ello devemos identificar el contenedor en donde se esta ejecutando postgresql, veamos los pasos:

Nota: para mas detalle de los comandos que vamos a trabajar en el post docker comandos básicos ls explicamos a detalle.

Aunque es opcional con el siguiente comando podemos ver que version de la imagen de postgres se ha descargado.

c:\code\codigoelectronica\docker-postgres>docker image list
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
postgres     12.6      145bb83bd157   3 months ago   314MB

Ahora vamos a identificar el contenedor donde se esta ejecutando postgresql, ejecute el siguiente comando donde mostrara la información del id del contenedor, la imagen que usa y datos adicionales.

c:\code\codigoelectronica\docker-postgres>docker ps -a
CONTAINER ID   IMAGE           COMMAND                  CREATED          STATUS              PORTS                                       NAMES
915a33cf511f   postgres:12.6   "docker-entrypoint.s…"   29 minutes ago   Up About a minute   0.0.0.0:5432->5432/tcp, :::5432->5432/tcp   docker-postgres_mydb_1

Con el id del contenedor podemos adjuntarnos o ingresar a el para que nos muestre su terminal de comandos, es decir la terminal linux de la imagen postgresql.

c:\code\codigoelectronica\docker-postgres>docker exec -it 915a33cf511f bash
root@915a33cf511f:/#

Por ultimo en la tarminal linux ingresamos lo siguiente:

root@915a33cf511f:/# psql -U admin -W -h localhost testdb
Password:
psql (12.6 (Debian 12.6-1.pgdg100+1))
Type "help" for help.

testdb=#
  • psql: es la instrucción que nos permite ingresar a la terminal de postgresql
  • -U admin: es el usuario que registramos en la variable "POSTGRES_USER" del archivo docker-compose-yml
  • -W: es la bandera para que nos solicite la contraseña de acceso, creada en la variable "POSTGRES_PASSWORD"
  • -h localhost: en este caso la maquina local, que seria el contenedor docker que se esta ejecutando
  • testdb: nombre de la base de datos a la que vamos a ingresar

Referencias

[1] docker compose https://docs.docker.com/compose/, Consultado Agosto 2021


Comentario

Debe aceptar antes de enviar

29 October 2022 08:38

me ayudó mucho. gracias.