Í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.
No es más sencillo?
https://docs.docker.com/compose/compose-file/#restart
Funciona para cualquier SO, y es el standard de docker