Tengo un VPS de uso general y estoy acoplando las aplicaciones en él. Habrá alrededor de 5-6 contenedores en él, y muy poco más, por lo que la caja se puede reconstruir trivialmente según sea necesario.
Para cada aplicación tengo un script de inicio. Un contenedor de WordPress se ve así:
#!/bin/bash# Get the host IP addressexport DOCKER_HOSTIP=`ifconfig docker0 | grep "inet addr" | cut -d ':' -f 2 | cut -d ' ' -f 1`echo "Connecting to database on Docker host ${DOCKER_HOSTIP}"docker run \ --add-host=docker:${DOCKER_HOSTIP} \ --network dockernet \ --network-alias jonblog \ --detach \ --restart always \ --rm \ jonblog
Sin embargo, eso devuelve un error:
Opciones en conflicto :restart restart y --rm
Hay varios tickets de Docker que dicen que esto es sensato, pero no lo entiendo. Creo que mi significado es claro: si un contenedor no se está ejecutando (por ejemplo, en el arranque), entonces quiero iniciarlo. Si muere, espero que se elimine el contenedor y se cree uno nuevo a partir de la imagen base. Los contenedores deben ser inmutables de todos modos: cualquier estado que desee conservar, como archivos multimedia y registros, se escribirá en volúmenes.
Así que pensé que debería dejar el --restart
marque y, a continuación, use un administrador de procesos para detener e iniciar contenedores de Docker. ¿Podría usar Monit aquí? Esperaba poder hacer algo como:
CHECK PROCESS jonblog MATCHING jonblog START PROGRAM = "/root/docker/jonblog/host-start.sh" STOP PROGRAM = "docker stop jon-blog"
Sin embargo, eso verifica la tabla de procesos del sistema, y no docker ps
, y por lo tanto no encontrará algo que coincida con la cadena especificada. ¿Puedo llevarlo al ejecutivo docker ps
periódicamente, y coinciden con las líneas en la salida?
Me encantaría usar otra herramienta si resulta sólida. Por ejemplo, encuentro que Supervisor es un poco pesado, pero si es más capaz de trabajar con Docker, estoy dispuesto a usarlo.
Aclaración sobre --rm
La razón por la que quiero --rm
es que durante el proceso de dockerización, detengo el contenedor que se está ejecutando actualmente, load
una nueva versión de la imagen y vuelva a ejecutar el script anterior. Esto significa que Docker está siendo notificado de un restart
política para cada contenedor. Descubrí que después de reiniciar la caja, tendría 15 o más versiones ligeramente diferentes de la aplicación ejecutándose simultáneamente, lo cual no es la intención.
Supongo que podría usar docker update --restart never
en contenedores viejos para evitar que esto suceda, pero luego, cuando mi contenedor se detiene, me quedo con él tirado, y tan pronto como lo haga, se eliminará automáticamente. Podría limpiar periódicamente los viejos usando algún tipo de trabajo cron, pero eso se siente un poco hacky dado que Docker puede hacerlo por mí.
Buscando una variedad de respuestas
Un comentario muy útil ha sugerido que debería analizar Minikube, que aparentemente simplifica la configuración de Kubernetes, incluso en la medida en que una persona con la habilidad adecuada puede estar en funcionamiento en cinco minutos.
Todavía me gustaría ver propuestas de soluciones más livianas, por lo que tengo una variedad de respuestas para elegir. Como se indicó, me gustaría saber la respuesta a si un supervisor de procesos como Monit funcionaría.
En la parte superior de mi cabeza, podría escribir un bucle de shell para escribir docker ps
a un archivo cada cinco segundos durante un minuto, y luego ejecútelo en un Cron cada minuto. Luego podría escanear ese archivo usando grep
y el Monit CHECK PROGRAM
comprobación del sistema. Eso es un poco hacky, pero es algo que puedo entender fácilmente si hay un problema con él. Cualquier avance en esa sugerencia?