Ejecutar cualquier docker-compose como servicio

1
4527

Índice de contenidos


1. Entorno

Este tutorial está escrito usando el siguiente entorno:

  • Hardware: Slimbook Pro 13.3″ (Intel Core i7, 32GB RAM)
  • Sistema Operativo: LUbuntu 16.04
  • LXD 2.21
  • Docker Compose 1.19.0
  • Docker 17.12.1-ce


2. Introducción

En este tutorial vamos a ver cómo de una forma muy sencilla podemos configurar servicios de systemd de cualquier docker-compose que queramos y de una forma completamente genérica.


3. Vamos al lío

Lo primero que tenemos que hacer es crear el fichero «/etc/systemd/system/docker-compose@.service» con el siguiente contenido:

[Unit]
Description=%i service with docker compose
Requires=docker.service
After=docker.service

[Service]
Restart=always

WorkingDirectory=/etc/docker/compose/%i

# Remove old containers, images and volumes
ExecStartPre=/usr/local/bin/docker-compose down -v
ExecStartPre=/usr/local/bin/docker-compose rm -fv
ExecStartPre=-/bin/bash -c 'docker volume ls -qf "name=%i_" | xargs docker volume rm'
ExecStartPre=-/bin/bash -c 'docker network ls -qf "name=%i_" | xargs docker network rm'
ExecStartPre=-/bin/bash -c 'docker ps -aqf "name=%i_*" | xargs docker rm'

# Compose up
ExecStart=/usr/local/bin/docker-compose up

# Compose down, remove containers and volumes
ExecStop=/usr/local/bin/docker-compose down -v

[Install]
WantedBy=multi-user.target

Esta es la configuración que habría que hacer para cada uno de los docker-compose que quisiéramos definir como servicio de la máquina. La gracia aquí es que hemos creado un servicio genérico, donde solo tenemos que tener en cuenta el situar nuestro fichero docker-compose.yml dentro de un directorio que cuelgue de «/etc/docker/compose».

Por ejemplo, si queremos utilizar docker-compose para levantar todos los contenedores necesarios para manejar selenium grid, lo primero que tenemos que hacer es crear el fichero /etc/docker/compose/selenium-grid/docker-compose.yml con el siguiente contenido.

version: '2'
services:
  firefox:
    image: selenium/node-firefox:3.11.0-antimony
    volumes:
      - /dev/shm:/dev/shm
    depends_on:
      - hub
    environment:
      HUB_HOST: hub

  chrome:
    image: selenium/node-chrome:3.11.0-antimony
    volumes:
      - /dev/shm:/dev/shm
    depends_on:
      - hub
    environment:
      HUB_HOST: hub

  hub:
    image: selenium/hub:3.11.0-antimony
    ports:

Nota: Para este tutorial el contenido del fichero es irrelevante, lo que importa es ver cómo crear un servicio para que estos contenedores se ejecuten en el arranque.

Ahora si queremos arrancar o parar los contenedores manejados por este docker-compose simplemente tenemos que ejecutar:

$> systemctl start docker-compose@selenium-grid
$> systemctl stop docker-compose@selenium-grid

Una vez hemos comprobado que ambos comandos se ejecutan correctamente. Simplemente tenemos que ejecutar este otro comando para establecer que el servicio se ejecute en el arranque de la máquina.

$> systemctl enable docker-compose@selenium-grid

Nota: fíjate que lo que va a continuación de la @ tiene que coincidir exactamente con el nombre del directorio.


4. Conclusiones

Como ves, de una forma genérica y sencilla ya podemos ejecutar cualquier docker-compose como servicio de la máquina con la ventaja de poder ejecutarse en el arranque de la máquina.

Cualquier duda o sugerencia en la zona de comentarios.

Saludos.

1 COMENTARIO

DEJA UNA RESPUESTA

Por favor ingrese su comentario!

He leído y acepto la política de privacidad

Por favor ingrese su nombre aquí

Información básica acerca de la protección de datos

  • Responsable:
  • Finalidad:
  • Legitimación:
  • Destinatarios:
  • Derechos:
  • Más información: Puedes ampliar información acerca de la protección de datos en el siguiente enlace:política de privacidad