Estoy tratando de entender Docker desde el punto de implementar una aplicación que está destinada a ejecutarse en los usuarios en el escritorio. Mi aplicación es simplemente una aplicación web de matraz y una base de datos mongo. Normalmente, instalaría tanto en una VM como reenviaría un puerto host a la aplicación web de invitado. Me gustaría probar Docker, pero no estoy seguro de cómo debo usar más de un programa. La documentación dice que solo puede haber ENTRYPOINT, entonces, ¿cómo puedo tener Mongo y mi aplicación de matraz? ¿O deben estar en contenedores separados, en cuyo caso, cómo se hablan y cómo facilita la distribución de la aplicación?
150
Respuestas:
Solo puede haber un PUNTO DE ENTRADA, pero ese objetivo suele ser un script que inicia la mayor cantidad de programas necesarios. También puede usar, por ejemplo, Supervisord o similar para encargarse de lanzar múltiples servicios dentro de un solo contenedor. Este es un ejemplo de un contenedor docker que ejecuta mysql, apache y wordpress dentro de un solo contenedor .
Diga: Tiene una base de datos que usa una sola aplicación web. Entonces, probablemente sea más fácil ejecutar ambos en un solo contenedor.
Si tiene una base de datos compartida que es utilizada por más de una aplicación, sería mejor ejecutar la base de datos en su propio contenedor y las aplicaciones cada una en sus propios contenedores.
Hay al menos dos posibilidades de cómo las aplicaciones pueden comunicarse entre sí cuando se ejecutan en diferentes contenedores:
fuente
Tenía un requisito similar de ejecutar una pila LAMP, Mongo DB y mis propios servicios
Docker es una virtualización basada en el sistema operativo, por lo que aísla su contenedor alrededor de un proceso en ejecución, por lo tanto, requiere al menos un proceso que se ejecute en FOREGROUND.
Por lo tanto, proporciona su propio script de inicio como punto de entrada, por lo que su script de inicio se convierte en un script de imagen Docker extendido, en el que puede apilar cualquier número de servicios hasta que SE INICIE AL MENOS UN SERVICIO ANTERIOR, QUE DEMASIADO HACIA EL FINAL
Entonces mi archivo de imagen Docker tiene dos líneas a continuación al final:
En mi script ejecuto todos los MySQL, MongoDB, Tomcat, etc. Al final ejecuto mi Apache como un subproceso en primer plano.
Esto me permite iniciar todos mis servicios y mantener vivo el contenedor con el último servicio iniciado en primer plano
Espero eso ayude
ACTUALIZACIÓN : desde la última vez que respondí a esta pregunta, han surgido cosas nuevas como Docker compose , que puede ayudarlo a ejecutar cada servicio en su propio contenedor, pero aunarlas como dependencias entre esos servicios, intente saber más sobre docker-compose y úselo, es una forma más elegante a menos que su necesidad no coincida con él.
fuente
Estoy totalmente en desacuerdo con algunas soluciones anteriores que recomiendan ejecutar ambos servicios en el mismo contenedor. Está claramente establecido en la documentación que no es recomendable :
Hay buenos casos de uso para supervisores o programas similares, pero ejecutar una aplicación web + base de datos no forma parte de ellos.
Definitivamente debe usar docker-compose para hacer eso y orquestar múltiples contenedores con diferentes responsabilidades.
fuente
Pueden estar en contenedores separados y, de hecho, si la aplicación también estuviera destinada a ejecutarse en un entorno más grande, probablemente lo estarían.
Un sistema de contenedores múltiples requeriría más orquestación para poder mostrar todas las dependencias requeridas, aunque en Docker v0.6.5 +, hay una nueva instalación para ayudar con eso integrado en Docker: vinculación . Sin embargo, con una solución de múltiples máquinas, todavía es algo que debe arreglarse desde fuera del entorno Docker.
Con dos contenedores diferentes, las dos partes aún se comunican a través de TCP / IP, pero a menos que los puertos se hayan bloqueado específicamente (no recomendado, ya que no podría ejecutar más de una copia), tendría que pasar el nuevo puerto que la base de datos ha sido expuesta en cuanto a la aplicación, para que pueda comunicarse con Mongo. Esto es nuevamente, algo con lo que Linking puede ayudar.
Para una instalación pequeña y más simple, donde todas las dependencias van en el mismo contenedor, también es posible tener tanto la base de datos como el tiempo de ejecución de Python iniciado por el programa que inicialmente se llama ENTRYPOINT. Esto puede ser tan simple como un script de shell o algún otro controlador de proceso: Supervisord es bastante popular y existen varios ejemplos en los Dockerfiles públicos.
fuente
Estoy de acuerdo con las otras respuestas de que es preferible usar dos contenedores, pero si está decidido a agrupar múltiples servicios en un solo contenedor, puede usar algo como la supervisión.
en Hipache, por ejemplo, el Dockerfile incluido ejecuta supervisord y el archivo supervisord.conf especifica que se ejecuten tanto hipache como redis-server.
fuente
Docker proporciona un par de ejemplos sobre cómo hacerlo. La opción ligera es:
fuente
Puede ejecutar 2 procesos en primer plano utilizando
wait
. Simplemente haga un script bash con el siguiente contenido. Por ejemplostart.sh
:En su Dockerfile, comience con
fuente
Si una secuencia de comandos dedicada parece demasiada sobrecarga, puede generar procesos separados explícitamente con
sh -c
. Por ejemplo:fuente