GNU/Linux >> Tutoriales Linux >  >> Panels >> Docker

Cómo implementar PostgreSQL como un contenedor Docker

PostgreSQL, también conocido como Postgres, es el principal sistema de base de datos relacional de objetos. Es popular debido a su alto nivel de cumplimiento con el estándar SQL y la inclusión de funciones adicionales que simplifican el trabajo con conjuntos de datos complejos a escala.

PostgreSQL utiliza una arquitectura cliente-servidor tradicional, por lo que debe ejecutarlo independientemente del código de su aplicación. En esta guía, implementará una instancia de servidor PostgreSQL como un contenedor de Docker. Esto evita agregar paquetes a su máquina host y ayuda a aislar su base de datos de las otras partes de su pila. Asegúrese de tener Docker instalado antes de continuar.

Cómo empezar

PostgreSQL tiene una imagen oficial en Docker Hub que está disponible en varias variantes diferentes. Las etiquetas le permiten seleccionar entre las principales versiones de PostgreSQL de v9 a v14 y elegir el sistema operativo utilizado como imagen base. Se ofrecen Alpine, Debian Stretch y Debian Bullseye.

Para los propósitos de este tutorial, usaremos postgres:14 etiqueta que proporciona PostgreSQL 14 encima de Bullseye. Puede seleccionar una versión diferente para satisfacer sus necesidades.

Inicie un contenedor de PostgreSQL usando docker run comando:

docker run -d 
    --name postgres 
    -p 5432:5432
    -e POSTGRES_PASSWORD=<password> 
    -v postgres:/var/lib/postgresql/data 
    postgres:14

debes proporcione un valor para POSTGRES_PASSWORD Variable ambiental. Esto define la contraseña que se asignará a la cuenta de superusuario predeterminada de Postgres. El nombre de usuario predeterminado es postgres pero se puede cambiar configurando POSTGRES_USER variable de entorno.

El -v flag se utiliza para montar un volumen de Docker en el directorio de datos del contenedor de PostgreSQL. Un volumen con nombre llamado postgres se hace referencia; Docker lo creará o volverá a adjuntar el volumen si ya existe. Debe usar un volumen para almacenar su base de datos fuera del contenedor. Sin uno, usará sus datos cuando el contenedor se detenga.

PostgreSQL escucha en el puerto 5432 de forma predeterminada. El puerto del contenedor está vinculado al puerto 5432 en su host Docker mediante -p bandera. El -d flag se usa para iniciar el contenedor en modo separado, lo que lo convierte en un servicio en segundo plano que continúa ejecutándose hasta que se detiene con docker stop .

Suministrar la contraseña como un archivo

Si no se siente cómodo proporcionando su contraseña de superusuario como un indicador CLI de texto sin formato, puede inyectarla como un archivo a través de un volumen. A continuación, debe establecer el POSTGRES_PASSWORD_FILE variable de entorno para dar a Postgres la ruta a ese archivo:

docker run -d 
    --name postgres 
    -p 5432:5432
    -e POSTGRES_PASSWORD_FILE=/run/secrets/postgres-password 
    -v ./postgres-password.txt:/run/secrets/postgres-password
    -v postgres:/var/lib/postgresql/data 
    postgres:14

Esta técnica también funciona para POSTGRES_USER y otras variables de entorno admitidas.

Conectando a su base de datos

Como PostgreSQL estaba vinculado al puerto 5432 anterior, podría conectarse a su base de datos en localhost:5432 desde cualquier cliente compatible. Utilice las credenciales que asignó como variables de entorno al iniciar el contenedor.

La imagen de Docker también incluye el psql binario que puede invocar con docker exec . Use esto para interactuar rápidamente con su base de datos desde un shell de PostgreSQL dentro del contenedor.

docker exec -it postgres psql -U postgres

Conexión desde otros contenedores Docker

La creación de una red Docker es la forma preferida de acceder a PostgreSQL desde otros contenedores en el mismo host. Esto evita vincular el puerto del servidor de Postgres y exponer potencialmente el servicio a la red más amplia de su host.

Cree una red Docker:

docker network create my-app

Inicie su contenedor de Postgres con una conexión a la red utilizando --network marcar con docker run :

docker run -d 
    --name postgres 
    --network my-app 
    -e POSTGRES_PASSWORD=<password> 
    -v postgres:/var/lib/postgresql/data 
    postgres:14

Ahora únase a su contenedor de aplicaciones a la misma red:

docker run -d
    --name api
    --network my-app
    my-api:latest

Los contenedores en la red pueden llegar a Postgres usando postgres hostname, ya que este es el name asignado al contenedor de Postgres. Utilice el puerto 5432 para completar la conexión.

Configuración de PostgreSQL

Puede pasar las opciones del servidor PostgreSQL usando -c banderas después del nombre de la imagen en su docker run comando:

docker run -d 
    --name postgres 
    -p 5432:5432
    -e POSTGRES_PASSWORD=<password> 
    -v postgres:/var/lib/postgresql/data 
    postgres:14 -c max_connections=100

Todo lo que sigue al nombre de la imagen se pasa al comando iniciado en el contenedor. Este comando será el binario del servidor PostgreSQL en el caso de la imagen de Postgres.

Puede usar un archivo de configuración personalizado cuando configura los valores de varias opciones. Deberá usar otro volumen de Docker para montar su archivo en el contenedor, luego proporcione un -c indicador para indicar a Postgres dónde buscar:

docker run -d 
    --name postgres 
    -p 5432:5432
    -e POSTGRES_PASSWORD=<password> 
    -v ./postgres.conf:/etc/postgresql/postgresql.conf 
    -v postgres:/var/lib/postgresql/data 
    postgres:14 -c config_file=/etc/postgresql/postgresql.conf

Este ejemplo utiliza un montaje de vinculación de Docker para obtener postgres.conf archivo en su directorio de trabajo montado en el contenedor /etc/postgresql directorio. Para obtener una referencia de las opciones que puede configurar con indicadores binarios o directivas de archivos de configuración, consulte la documentación de PostgreSQL.

Sembrar la base de datos

La imagen de Docker admite archivos semilla colocados en /docker-entrypoint-initdb.d directorio. Cualquier .sql o .sql.gz se ejecutarán los archivos para inicializar la base de datos. Esto ocurre después de la cuenta de usuario predeterminada y postgres se ha creado la base de datos. También puede agregar .sh archivos para ejecutar scripts de shell arbitrarios. Todos los scripts se ejecutan en orden alfabético.

Este mecanismo significa que todo lo que necesita para inicializar su base de datos es un conjunto de scripts SQL o shell nombrados en el orden secuencial correcto. Móntelos en su nuevo contenedor usando un -v marcar con docker run :

docker run -d 
    --name postgres 
    -p 5432:5432
    -e POSTGRES_PASSWORD=<password> 
    -v ./db-seed-files/:/etc/docker-entrypoint-initdb.d 
    -v postgres:/var/lib/postgresql/data 
    postgres:14

Los scripts de inicialización solo se utilizarán cuando el directorio de datos de Postgres esté vacío. A efectos prácticos, eso significa que se ejecutarán la primera vez que el contenedor se inicie con un nuevo volumen vacío adjunto.

Creando una Imagen de Base de Datos Personalizada

Puede optar por encapsular su archivo de configuración y los scripts de inicialización en su propia imagen de Docker. Esto permitiría que cualquier persona con acceso a la imagen genere una nueva instancia de PostgreSQL que esté preconfigurada para su aplicación. Aquí hay un Dockerfile simple que podría usar:

FROM postgres:14
COPY postgres.conf /etc/postgresql/postgresql.conf
COPY db-seed-files/ /etc/docker-entrypoint-initdb.d/
CMD ["-c", "config_file=/etc/postgresql/postgresql.conf"]

Cree su imagen personalizada:

docker build -t custom-postgres:latest .

Las instrucciones de compilación en Dockerfile copiarán el archivo de configuración de PostgreSQL y los scripts de inicialización de su directorio de trabajo y los incrustarán en la imagen del contenedor. Ahora puede iniciar un contenedor de base de datos sin proporcionar manualmente los recursos:

docker run -d 
    --name custom-postgres 
    -p 5432:5432
    -e POSTGRES_PASSWORD=<password> 
    -v postgres:/var/lib/postgresql/data 
    custom-postgres:latest

¿Debería contenerizar su base de datos de producción?

Puede ser difícil decidir si ejecutar una base de datos en Docker. Contenerizar PostgreSQL hace que la experiencia de configuración sea más fácil, pero a veces es más difícil de mantener. Debe tener cuidado al administrar su contenedor para evitar la pérdida de datos en el futuro. Docker también agrega una modesta sobrecarga de rendimiento que vale la pena considerar cuando anticipa que la base de datos de visitas funcionará con volúmenes de datos muy grandes.

Los beneficios de Docker son una mayor portabilidad, facilidad de escalado y eficiencia del desarrollador. Contener su base de datos le permite a cualquiera crear una instancia nueva usando Docker, sin instalar y configurar PostgreSQL manualmente primero. Por lo tanto, escribir un Dockerfile para su base de datos PostgreSQL que agregue su archivo de configuración y secuencias de comandos SQL es una buena manera de ayudar a los desarrolladores a iniciar rápidamente nuevos entornos.

Resumen

PostgreSQL es un motor de base de datos avanzado basado en SQL que agrega capacidades relacionales de objetos. Si bien puede optar por ejecutar una implementación tradicional en producción, el uso de una instancia en contenedor simplifica la configuración y ayuda a los desarrolladores a poner en marcha rápidamente su propia infraestructura.

El aspecto más crítico de una implementación dockerizada es asegurarse de que está utilizando un volumen para almacenar sus datos. Esto le permitirá detener, reemplazar y actualizar su contenedor a una versión de imagen posterior sin perder su base de datos. Más allá del almacenamiento, debe evaluar cómo se conectará a Postgres y evitar vincular puertos a su host a menos que sea necesario. Cuando se conecta desde otro contenedor, es mejor usar una red Docker compartida para facilitar el acceso.


Docker
  1. Cómo instalar WordPress usando Docker

  2. Cómo implementar un contenedor nginx con Docker en Linode

  3. Cómo instalar Docker e implementar una pila LAMP

  4. Cómo ejecutar MySQL en un contenedor Docker

  5. Cómo instalar Vim en un contenedor Docker

Cómo ejecutar Grafana en un contenedor Docker

Cómo implementar un contenedor Docker en AWS Elastic Beanstalk

Cómo implementar y administrar un contenedor Docker MongoDB

Cómo configurar un contenedor Apache Docker

Cómo ejecutar contenedores Docker

Cómo implementar un contenedor Docker en Jelastic Cloud