¿Cómo inicio automáticamente los contenedores Docker en el arranque del sistema?

¿Cuál es una buena manera de iniciar automáticamente los contenedores Docker cuando se inicia el sistema?

¿Hay una forma preferida de hacer esto en Ubuntu 14.04?

He usado supervisord en el pasado para iniciar automáticamente aplicaciones web. Pero eso no parece lo correcto para Docker.

Aparentemente, el método actual para iniciar automáticamente los contenedores Docker (desde Docker 1.2) es utilizar políticas de reinicio. Esto controlará cómo Docker debe manejar el inicio del contenedor al inicio y el reinicio del contenedor cuando salga. He usado la opción 'siempre' hasta ahora, y puedo confirmar que hace que Docker inicie automáticamente el contenedor en el arranque del sistema:

sudo docker run --restart=always -d myimage

Extracto de la Documentación

Al usar el indicador --restart en la ejecución de Docker, puede especificar una política de reinicio sobre cómo se debe o no reiniciar un contenedor al salir.

no-No reinicie el contenedor cuando salga.

en caso de error: Reinicie el contenedor solo si sale con un estado de salida distinto de cero.

siempre: Reinicie siempre el contenedor, independientemente del estado de salida.

También puede especificar la cantidad máxima de veces que Docker intentará reiniciar el contenedor cuando utilice la directiva en caso de error. El valor predeterminado es que Docker intentará reiniciar el contenedor para siempre.

$ sudo docker run --restart=always redis

Esto ejecutará el contenedor redis con una política de reinicio de siempre, de modo que si el contenedor sale, Docker lo reiniciará.

$ sudo docker run --restart=on-failure:10 redis

Esto ejecutará el contenedor de redis con una política de reinicio en caso de error y un recuento máximo de reinicios de 10. Si el contenedor redis sale con un estado de salida distinto de cero más de 10 veces seguidas, Docker abortará el intento de reiniciar el contenedor. Proporcionar un límite de reinicio máximo solo es válido para la directiva en caso de error.

Docker tiene esta página eso explica cómo hacerlo con upstart y systemd. Estoy de acuerdo en que no parece lo correcto para Docker. Su solución es correr docker start, lo que supone que ya ha creado su contenedor. Yo pensaría que tú lo harías docker run --rm en el script upstart (tratándolo como un proceso y contenedor completamente nuevos a partir de una imagen) o simplemente deje que el demonio docker reinicie los contenedores en el arranque (como lo hará de forma predeterminada si no hace nada más). Upstart tiene la ventaja de permitir un fácil inicio/parada de procesos, pero también se obtiene con el inicio/parada de docker.

Creo que es extraño obligar al usuario a crear manualmente un contenedor (con todos los enlaces de puerto/volumen correctos) antes de que funcione el script advenedizo.

Pero eso no parece lo correcto para Docker.

¿Por qué no?

Utilizo Supervisord para esto con gran éxito.

Use lo que sabe, use lo que funciona, use algo que pueda mantener y comprender fácilmente.