Documentación/ Despliegue/ Docker Compose

Docker Compose

Despliegue un docker-compose.yml como una sola aplicación de sh0: cada servicio se convierte en un contenedor en una red privada, con volúmenes con nombre y una única dirección pública.

Descripción general

sh0 importa un archivo Compose como una sola aplicación. Cada servicio se convierte en un contenedor iniciado desde su image, en el orden que marca depends_on. Los servicios no se pueden construir: un servicio que declara build: se rechaza; construya su imagen en otro sitio o despliéguelo como una aplicación aparte desde su repositorio Git.

Desplegar una pila

En el panel, abra una pila, haga clic en Agregar app, elija Docker Compose, ponga un nombre a la aplicación, pegue el archivo en docker-compose.yml y haga clic en Desplegar. Desde la CLI, sh0 compose validate comprueba un archivo y sh0 compose deploy lo despliega. Ejemplo con un servicio web y una caché Redis:

docker-compose.yml
services:
  web:
    image: traefik/whoami:v1.10
    ports:
      - "8080:80"
    environment:
      REDIS_URL: redis://cache:6379
    depends_on:
      - cache
    deploy:
      resources:
        limits:
          memory: 64M
          cpus: "0.25"
    healthcheck:
      test: ["CMD", "true"]
  cache:
    image: redis:7-alpine
    mem_limit: 128m
    cpus: 0.5
    volumes:
      - cache-data:/data
volumes:
  cache-data:
Terminal
$ sh0 compose validate docker-compose.yml
[ok] Compose file is valid
  Services: web, cache

$ sh0 compose deploy --app-name my-stack --wait docker-compose.yml
[*] Deploying compose file 'docker-compose.yml' as 'my-stack'...
[ok] Compose stack 'my-stack' deployed (app ID: 79389ae4-4a59-42a5-b8f6-37a018c95ddc, status: deploying)
[*] Waiting for deployment to complete...
[ok] Deployment completed successfully

--var CLAVE=VALOR (repetible) sustituye el valor de la variable de entorno CLAVE en cada servicio que la define.

Qué comprueba la validación

Un archivo se rechaza si no tiene servicios, si un servicio no tiene image, declara build:, tiene un puerto no válido o un comando ilegible, o monta una ruta del host (/srv/data:/data, ./data:/data): solo se admiten volúmenes con nombre. Las claves que sh0 no lee no se señalan: el ejemplo anterior pasa la validación aunque sus bloques deploy y healthcheck se ignoran.

Claves de Compose

Claves que lee sh0:

  • image: obligatoria, se descarga de Docker Hub o de cualquier registro.
  • ports: solo se usa el puerto del contenedor. El primer servicio, en el orden del archivo, que declara un puerto recibe la dirección pública de la aplicación a través del proxy inverso. El puerto del host que escriba no se abre en el servidor.
  • environment: en forma de mapa o de lista.
  • volumes: solo volúmenes con nombre. Un volumen cache-data de la aplicación my-stack se crea como sh0-my-stack-cache-data y persiste entre reinicios.
  • depends_on: orden de arranque, en forma de lista o extendida.
  • command: cadena o lista.
  • mem_limit y cpus: límites de memoria y de CPU del servicio. Son las únicas claves de recursos que lee sh0.

Claves ignoradas

deploy (incluido deploy.resources), healthcheck, entrypoint, restart, labels y networks se aceptan y se ignoran. Cada contenedor recibe la política de reinicio unless-stopped, y un servicio sin mem_limit ni cpus recibe los límites por defecto. En la pila de ejemplo, el límite de 64 MB escrito en deploy.resources no se aplicó, mientras que mem_limit: 128m sí:

Terminal
$ docker inspect -f "{{.Name}} mem={{.HostConfig.Memory}} nanocpus={{.HostConfig.NanoCpus}} restart={{.HostConfig.RestartPolicy.Name}}" \
    sh0-17b83e1c-my-stack-web sh0-17b83e1c-my-stack-cache
/sh0-17b83e1c-my-stack-web mem=536870912 nanocpus=1000000000 restart=unless-stopped
/sh0-17b83e1c-my-stack-cache mem=134217728 nanocpus=500000000 restart=unless-stopped

Red

Los servicios de una pila comparten una red privada y se alcanzan por su nombre de servicio: en el ejemplo, el contenedor cache obtiene respuesta de http://web:80. Solo el servicio que tiene la dirección pública es accesible desde fuera.

Gestionar los servicios

La pila aparece como una sola aplicación en sh0 apps y en el panel. Sus servicios se listan con GET /api/v1/apps/<app-id>/services y se pueden reiniciar, detener o iniciar uno a uno con POST /api/v1/apps/<app-id>/services/<service-id>/restart (o /stop, /start).

Modificar una pila desplegada

La versión 1.10.2 no permite aplicar una nueva versión del archivo Compose a una pila existente. Volver a desplegar el archivo con el mismo nombre se rechaza, y volver a desplegar la aplicación falla porque no tiene repositorio:

Terminal
$ sh0 compose deploy --app-name my-stack docker-compose.yml
[*] Deploying compose file 'docker-compose.yml' as 'my-stack'...
Error: An app with name 'my-stack' already exists (VALIDATION_ERROR)

$ sh0 deploy my-stack --wait
[*] Deploying my-stack...
  Deployment ID: 34f99c19-adda-4a30-a1dc-4e670a3ff505
  Status:        queued
[*] Waiting for deployment to complete...
error: Deployment failed.

# Build log of that deployment:
[STEP 1/6] Cloning repository
[ERROR] App has no repository URL configured

Estos fallos no afectan a los servicios en marcha. Para modificar la pila, despliegue el nuevo archivo con otro nombre, traslade el tráfico y los datos y después elimine la aplicación anterior; sh0 delete elimina una aplicación y sus recursos.

Warning
No incluya secretos reales en un archivo Compose versionado. Deje un valor provisional en environment y fije el real al desplegar con --var.