Ir al contenidoIr a la navegación de la página: página anterior [tecla de acceso p]/página siguiente [tecla de acceso n]
documentation.suse.com / Gestión de aplicaciones de varios contenedores mediante docker-compose

Gestión de aplicaciones de varios contenedores mediante docker-compose

Fecha de publicación: 12 Dic 2024
DESCRIPCIÓN

docker-compose permite definir y gestionar una aplicación de varios contenedores. La herramienta simplifica la distribución de una pila de aplicaciones de este tipo mediante un archivo de definición fácil de usar.

INTENCIÓN

En este artículo se describe cómo crear una aplicación de varios contenedores mediante docker-compose.

ESFUERZO

Se tardan aproximadamente 20 minutos en leer el artículo.

OBJETIVO

Podrá crear su propia pila de aplicaciones basada en contenedores.

REQUISITOS

Las imágenes del contenedor de aplicaciones o los archivos de origen asociados que se utilizan para crear la aplicación.

1 Herramientas implicadas en la gestión de aplicaciones de varios contenedores

docker-compose es la herramienta responsable de crear la aplicación de varios contenedores. Por defecto, utiliza Docker, que no está presente en SLE Micro. Para omitir Docker y utilizar Podman en su lugar, se utiliza el guion podman-docker. Por lo tanto, no es necesario cambiar los guiones existentes de Docker a Podman. Las siguientes secciones proporcionan descripciones detalladas de las herramientas.

1.1 Acerca de Podman

Podman es la abreviatura de Pod Manager Tool (Herramienta de gestión de pods). Se trata de un motor de contenedor sin daemon que permite ejecutar y distribuir aplicaciones mediante contenedores e imágenes de contenedor. Podman proporciona una interfaz de línea de comandos para gestionar contenedores.

Como Podman no tiene un daemon, proporciona integración con systemd. Esto hace posible controlar los contenedores mediante unidades systemd. Puede crear estas unidades para contenedores existentes, así como generar unidades que puedan iniciar contenedores si no existen en el sistema. Podman puede ejecutar systemd dentro de contenedores.

Podman permite organizar los contenedores en pods. Los pods comparten la misma interfaz de red y los mismos recursos. Un caso de uso típico para organizar un grupo de contenedores en un pod es un contenedor que ejecuta una base de datos y un contenedor con un cliente que accede a la base de datos.

1.1.1 Instalación de Podman

Podman se incluye en SLE Micro por defecto. Sin embargo, si falta Podman, puede instalarlo como se describe a continuación:

  1. Ejecute el comando:

    > sudo transactional-update pkg install podman*
  2. Reinicie el sistema para arrancar en la nueva instantánea.

1.2 Acerca de podman-docker

podman-docker es un guion bash que cambia cualquier comando docker que se ejecute en un comando podman correspondiente con los mismos argumentos pasados. Por lo tanto, puede utilizar todos los guiones de Docker sin realizar ninguna modificación.

1.2.1 Instalación de podman-docker

podman-docker no está instalado en SLE Micro por defecto. Para instalarlo, haga lo siguiente:

  1. Instale el paquete podman-docker ejecutando:

    transactional-update pkg install podman-docker
  2. Rearranque el sistema para cambiar a la última instantánea.

1.3 Acerca de docker-compose

docker-compose es una herramienta para gestionar aplicaciones de varios contenedores. Permite tener varios entornos aislados en un solo host, y además admite el uso de variables entre entornos. Con docker-compose, puede volver a crear solo los contenedores que han cambiado sin destruir toda la aplicación de varios contenedores.

Importante
Importante: docker se reemplaza con el comando podman

En SLE Micro, el guion podman-docker se utiliza para llamar a Podman siempre que se ejecuta docker-compose, ya que Docker no está presente en SLE Micro.

1.3.1 Instalación de docker-compose

Si docker-compose no está presente en el sistema, puede instalarlo siguiendo estos pasos:

  1. Ejecute el comando:

    > sudo transactional-update pkg install docker-compose
  2. Cuando finalice la instalación, rearranque el sistema para arrancar en la nueva instantánea.

2 Creación de una aplicación de varios contenedores

Para crear una aplicación de varios contenedores, haga lo siguiente:

  1. Cree el archivo de configuración compose.yml. Para obtener información detallada, consulte la Sección 2.1, “Creación de compose.yml.

  2. Prepare la estructura de directorios necesaria. Se recomienda colocar el archivo compose.yml en la parte superior del directorio de trabajo.

  3. Si es necesario, escriba sus propios archivos de contenedor específicos para los servicios utilizados por la aplicación en contenedor. Por ejemplo, para distribuir una aplicación Go, cree un archivo de contenedor para la aplicación Go con la configuración y las dependencias necesarias.

    Se recomienda crear un subdirectorio por servicio en el directorio de trabajo y colocar allí los archivos específicos del servicio.

  4. Distribuya la aplicación de varios contenedores. Para obtener información detallada, consulte la Sección 2.2, “Distribución de aplicaciones de varios contenedores”.

2.1 Creación de compose.yml

Para crear la aplicación de varios contenedores, debe crear un archivo compose.yml situado preferiblemente en el directorio de trabajo. Puede tratarse de un único archivo, o puede utilizar un enfoque más detallado mediante fragmentos y extensiones. También se pueden fusionar varios archivos de docker-compose para definir el modelo de aplicación completo.

El archivo compose.yml define su aplicación. Puede incluir las siguientes partes.

services

Un servicio es un componente informático de la aplicación. Para obtener más información sobre la definición, consulte la Sección 2.1.1, “Definición de servicios”.

networks

Puede utilizar la instrucción network para definir redes personalizadas y asignar servicios concretos a redes personalizadas. Para obtener información detallada, consulte la Sección 2.1.2, “Definición de redes”.

volumes

Un volumen es un directorio gestionado por el motor del contenedor donde los servicios almacenan y comparten datos.

environment variables

Es posible que también necesite utilizar una lista de variables de entorno que se pasarán a sus servicios. Para obtener información detallada, consulte environment variables reference.

configs

Todos los archivos de configuración requeridos por los servicios deben declararse en la sección configs. Para obtener información detallada, consulte configs definition.

2.1.1 Definición de servicios

Al definir los servicios, debe especificar la imagen de contenedor que se debe utilizar o proporcionar archivos de origen para crear el servicio a partir de ellos.

Para crear el contenedor de servicios a partir de una imagen, utilice la instrucción image:

services:
  db:
    image: database

Podman comprueba si el nombre de la imagen declarado en el archivo compose.yml está disponible en el almacenamiento del contenedor local. Si no es así, Podman extrae la imagen de uno de los registros configurados.

Para crear un servicio a partir de archivos de origen, proporcione los archivos de origen y cree un archivo de contenedor, ambos en el mismo directorio. En el archivo compose.yml, utilice la instrucción build:

services:
  db: 
    build: PATH_TO_SOURCE_FILES

Si un servicio concreto debe iniciarse después de otro, puede utilizar la instrucción depends_on:

services:
  db:
    image: database
    depends_on:
    system:
      condition: SERVICE_CONDITION

SERVICE_CONDITION puede tener uno de estos valores: service_started, service_healthy o service_completed_successfully.

Para obtener más información sobre la definición de services, consulte services specification.

2.1.2 Definición de redes

Por defecto, docker-compose crea una red por defecto y cada contenedor de la pila de aplicaciones se incluye en la red. La red por defecto no tiene que estar declarada en el archivo compose.yml, ya que docker-compose la crea automáticamente.

También puede definir redes personalizadas y asignarles servicios concretos. Por ejemplo, para crear dos redes network1 y network2, añada el siguiente fragmento:

networks:
  network1:
    # Use a custom driver
    driver: custom-driver-1
  network2:
    # Use a custom driver and name the network
    driver: custom-driver-2
    name: custom_network

También puede utilizar una red existente. En este caso, marque la red como externa:

networks:
  network1:
    name: network1
    external: true

Para obtener la especificación de networks completa, consulte networks specification.

2.1.3 Ejemplo de compose.yml

El siguiente ejemplo de compose.yml define una pila de aplicaciones que utiliza el sistema de monitorización Prometheus y el sistema de análisis Grafana.

services:
  prometheus:
    image: prom/prometheus
    container_name: prometheus
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
    ports:
      - 9090:9090
    restart: unless-stopped
    volumes:
      - ./prometheus:/etc/prometheus
      - prom_data:/prometheus
  grafana:
    image: grafana/grafana
    container_name: grafana
    ports:
      - 3000:3000
    restart: unless-stopped
    environment:
      - GF_SECURITY_ADMIN_USER=admin
      - GF_SECURITY_ADMIN_PASSWORD=grafana
    volumes:
      - ./grafana:/etc/grafana/provisioning/datasources
volumes:
  prom_data:

La estructura del proyecto en este ejemplo debe tener el aspecto siguiente:

.
├── compose.yaml
├── grafana
│   └── datasource.yml
├── prometheus
│   └── prometheus.yml
└── README.md

2.2 Distribución de aplicaciones de varios contenedores

Después de crear la estructura de directorios adecuada y el archivo compose.yml, puede distribuir la aplicación de varios contenedores:

  1. Compruebe que el contenedor que desea ejecutar no exista:

    > podman ps --all

    Si es necesario, elimine el contenedor concreto:

    > podman rm -fCONTAINER_ID
  2. Inicie la aplicación de varios contenedores ejecutando el siguiente comando desde el directorio donde se encuentra compose.yml:

    > docker compose up -d

    docker-compose crea una red independiente para la aplicación de varios contenedores.

  3. Puede verificar que los contenedores se están ejecutando y los puertos están asignados mostrando los contenedores en ejecución:

    > podman ps

3 Gestión de una aplicación de varios contenedores

Después de crear la aplicación de varios contenedores, puede utilizar el comando docker-compose para realizar operaciones de gestión. La sintaxis del comando es la siguiente:

> docker compose[OPTIONS]COMMAND

Ejecute el comando desde el mismo directorio donde se encuentra el archivo compose.yml de la aplicación de varios contenedores que desea gestionar. También puede proporcionar una vía al archivo compose.yml mediante la opción -f, --file. Por ejemplo, para salir y eliminar la aplicación de varios contenedores:

> docker compose -f ./test/compose.yml down

Otros comandos útiles:

images

Muestra todas las imágenes utilizadas por los contenedores en la aplicación de varios contenedores.

> docker compose images
pause

Pausa todos los contenedores.

> docker compose pause[SERVICE]
ps

Muestra los contenedores de la aplicación de varios contenedores.

> docker compose ps
rm

Elimina contenedores detenidos.

> docker compose rm
start/stop

Inicia o detiene los contenedores.

> docker compose stop[SERVICE]

Para obtener una lista completa de opciones y comandos, ejecute:

> docker-compose --help