# Cómo funciona Compose


Con Docker Compose, utilizas un archivo de configuración YAML, conocido como [archivo de Compose](#el-archivo-de-compose), para configurar los servicios de tu aplicación, y luego creas e inicias todos los servicios desde tu configuración con la [CLI de Compose](#cli).

El archivo de Compose, o archivo `compose.yaml`, sigue las reglas proporcionadas por la [Especificación de Compose](/reference/compose-file/) sobre cómo definir aplicaciones de múltiples contenedores. Esta es la implementación de Docker Compose de la [Especificación de Compose](https://github.com/compose-spec/compose-spec) formal.

**El modelo de aplicación de Compose**



Los componentes informáticos de una aplicación se definen como [servicios](/reference/compose-file/services/). Un servicio es un concepto abstracto implementado en plataformas mediante la ejecución de una misma imagen de contenedor, y su configuración, una o más veces.

Los servicios se comunican entre sí a través de [redes](/reference/compose-file/networks/). En la Especificación de Compose, una red es una abstracción de la capacidad de la plataforma para establecer una ruta IP entre contenedores dentro de servicios conectados entre sí.

Los servicios almacenan y comparten datos persistentes en [volúmenes](/reference/compose-file/volumes/). La Especificación describe estos datos persistentes como un montaje de sistema de archivos de alto nivel con opciones globales.

Algunos servicios requieren datos de configuración que dependen del entorno de ejecución o de la plataforma. Para esto, la Especificación define un concepto dedicado de [configs](/reference/compose-file/configs/). Desde el interior del contenedor, los configs se comportan como volúmenes: se montan como archivos. Sin embargo, los configs se definen de manera diferente a nivel de plataforma.

Un [secreto](/reference/compose-file/secrets/) es un tipo específico de datos de configuración para información sensible que no debe exponerse sin consideraciones de seguridad. Los secretos se ponen a disposición de los servicios como archivos montados en sus contenedores, pero los recursos específicos de la plataforma para proporcionar datos sensibles son lo suficientemente específicos como para merecer un concepto y una definición distintos dentro de la Especificación de Compose.

> [!NOTE]
>
> Con los volúmenes, configs y secretos, puedes tener una declaración simple en el nivel superior y luego añadir más información específica de la plataforma a nivel de servicio.

Un proyecto es un despliegue individual de una especificación de aplicación en una plataforma. El nombre de un proyecto, establecido con el atributo [`name`](/reference/compose-file/version-and-name/) de nivel superior, se utiliza para agrupar recursos y aislarlos de otras aplicaciones o de otras instalaciones de la misma aplicación especificada en Compose con parámetros distintos. Si estás creando recursos en una plataforma, debes prefijar los nombres de los recursos con el nombre del proyecto y establecer la etiqueta `com.docker.compose.project`.

Compose te permite establecer un nombre de proyecto personalizado y sobrescribir este nombre, de modo que el mismo archivo `compose.yaml` se pueda desplegar dos veces en la misma infraestructura, sin cambios, pasando un nombre distinto.




## El archivo de Compose

La ruta predeterminada para un archivo de Compose es `compose.yaml` (preferida) o `compose.yml` ubicado en el directorio de trabajo.
Compose también admite `docker-compose.yaml` y `docker-compose.yml` para la compatibilidad con versiones anteriores.
Si ambos archivos existen, Compose prefiere el `compose.yaml` canónico.

Puedes usar [fragmentos](/reference/compose-file/fragments/) y [extensiones](/reference/compose-file/extension/) para mantener tu archivo de Compose eficiente y fácil de mantener.

Varios archivos de Compose se pueden [fusionar](/reference/compose-file/merge/) para definir el modelo de aplicación. La combinación de archivos YAML se implementa añadiendo o sobrescribiendo elementos YAML según el orden de los archivos de Compose que establezcas. Los atributos simples y los mapas se sobrescriben por el archivo de Compose de mayor orden, mientras que las listas se fusionan mediante adición. Las rutas relativas se resuelven en función de la carpeta contenedora del primer archivo de Compose, siempre que los archivos complementarios que se estén fusionando estén alojados en otras carpetas. Dado que algunos elementos del archivo de Compose se pueden expresar tanto como cadenas simples como objetos complejos, las fusiones se aplican a la forma expandida. Para obtener más información, consulta [Trabajar con múltiples archivos de Compose](/compose/how-tos/multiple-compose-files/).

Si quieres reutilizar otros archivos de Compose, o separar partes del modelo de tu aplicación en archivos de Compose independientes, también puedes usar [`include`](/reference/compose-file/include/). Esto es útil si tu aplicación de Compose depende de otra aplicación gestionada por un equipo diferente, o si necesitas compartirla con otros.

## CLI

La CLI de Docker te permite interactuar con tus aplicaciones de Docker Compose a través del comando `docker compose` y sus subcomandos. Si utilizas Docker Desktop, la CLI de Docker Compose está incluida de forma predeterminada.

Mediante la CLI, puedes gestionar el ciclo de vida de tus aplicaciones de múltiples contenedores definidas en el archivo `compose.yaml`. Los comandos de la CLI te permiten iniciar, detener y configurar tus aplicaciones.

### Comandos clave

Para iniciar todos los servicios definidos en tu archivo `compose.yaml`:

```console
$ docker compose up
```

Para detener y eliminar los servicios en ejecución:

```console
$ docker compose down
```

Si quieres supervisar la salida de tus contenedores en ejecución y depurar problemas, puedes ver los logs con:

```console
$ docker compose logs
```

Para listar todos los servicios junto con su estado actual:

```console
$ docker compose ps
```

Para obtener una lista completa de todos los comandos de la CLI de Compose, consulta la [documentación de referencia](/reference/cli/docker/compose/).

## Ejemplo ilustrativo

El siguiente ejemplo ilustra los conceptos de Compose descritos anteriormente. Este ejemplo no es normativo.

Considera una aplicación dividida en una aplicación web frontend y un servicio backend.

El frontend se configura en tiempo de ejecución con un archivo de configuración HTTP gestionado por la infraestructura, que proporciona un nombre de dominio externo, y un certificado de servidor HTTPS inyectado por el almacén de secretos seguro de la plataforma.

El backend almacena datos en un volumen persistente.

Ambos servicios se comunican entre sí en una red back-tier aislada, mientras que el frontend también está conectado a una red front-tier y expone el puerto 443 para uso externo.

![Ejemplo de aplicación de Compose](/compose/images/compose-application.webp)

La aplicación de ejemplo se compone de las siguientes partes:

- Dos servicios, respaldados por imágenes de Docker: `webapp` y `database`
- Un secreto (certificado HTTPS), inyectado en el frontend
- Una configuración (HTTP), inyectada en el frontend
- Un volumen persistente, conectado al backend
- Dos redes

```yml
services:
  frontend:
    image: example/webapp
    ports:
      - "443:8043"
    networks:
      - front-tier
      - back-tier
    configs:
      - httpd-config
    secrets:
      - server-certificate

  backend:
    image: example/database
    volumes:
      - db-data:/etc/data
    networks:
      - back-tier

volumes:
  db-data:
    driver: flocker
    driver_opts:
      size: "10GiB"

configs:
  httpd-config:
    external: true

secrets:
  server-certificate:
    external: true

networks:
  # La presencia de estos objetos es suficiente para definirlos
  front-tier: {}
  back-tier: {}
```

El comando `docker compose up` inicia los servicios `frontend` y `backend`, crea las redes y volúmenes necesarios, e inyecta la configuración y el secreto en el servicio frontend.

`docker compose ps` proporciona una instantánea del estado actual de tus servicios, lo que muestra qué contenedores están en ejecución, su estado y los puertos que están utilizando:

```text
$ docker compose ps

NAME                IMAGE                COMMAND                  SERVICE             CREATED             STATUS              PORTS
example-frontend-1  example/webapp       "nginx -g 'daemon of…"   frontend            2 minutes ago       Up 2 minutes        0.0.0.0:443->8043/tcp
example-backend-1   example/database     "docker-entrypoint.s…"   backend             2 minutes ago       Up 2 minutes
```

## Siguientes pasos

- [Prueba la guía de inicio rápido](/compose/gettingstarted/)
- [Explora algunas aplicaciones de ejemplo](https://github.com/docker/awesome-compose)
- [Familiarízate con la Especificación de Compose](/reference/compose-file/)

