tag images hub example dockers compose docker

images - ¿Puedo ejecutar múltiples programas en un contenedor Docker?



dockers images (6)

Estoy tratando de abarcar Docker desde el punto de implementación de una aplicación que se ejecutará 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 ambos en una VM y reenviaré un puerto host a la aplicación web invitada. Me gustaría darle una oportunidad a Docker, pero no estoy seguro de cómo debo usar más de un programa. La documentación dice que solo puede haber ENTRYPOINT, ¿cómo puedo tener Mongo y mi aplicación de matraz? ¿O necesitan estar en un contenedor separado, en cuyo caso cómo se hablan entre sí y cómo facilita la distribución de la aplicación?


Docker proporciona un par de ejemplos sobre cómo hacerlo. La opción liviana es:

Coloque todos sus comandos en una secuencia de comandos contenedora, completa con información de prueba y depuración. Ejecute el script de envoltura como su CMD . Este es un ejemplo muy ingenuo. Primero, el script de envoltura:

#!/bin/bash # Start the first process ./my_first_process -D status=$? if [ $status -ne 0 ]; then echo "Failed to start my_first_process: $status" exit $status fi # Start the second process ./my_second_process -D status=$? if [ $status -ne 0 ]; then echo "Failed to start my_second_process: $status" exit $status fi # Naive check runs checks once a minute to see if either of the processes exited. # This illustrates part of the heavy lifting you need to do if you want to run # more than one service in a container. The container will exit with an error # if it detects that either of the processes has exited. # Otherwise it will loop forever, waking up every 60 seconds while /bin/true; do ps aux |grep my_first_process |grep -q -v grep PROCESS_1_STATUS=$? ps aux |grep my_second_process |grep -q -v grep PROCESS_2_STATUS=$? # If the greps above find anything, they will exit with 0 status # If they are not both 0, then something is wrong if [ $PROCESS_1_STATUS -ne 0 -o $PROCESS_2_STATUS -ne 0 ]; then echo "One of the processes has already exited." exit -1 fi sleep 60 done

A continuación, el archivo Dockerfile:

FROM ubuntu:latest COPY my_first_process my_first_process COPY my_second_process my_second_process COPY my_wrapper_script.sh my_wrapper_script.sh CMD ./my_wrapper_script.sh


Estoy de acuerdo con las otras respuestas de que es preferible usar dos contenedores, pero si está decidido a incluir varios servicios en un único contenedor, puede usar algo como supervisord.

en Hipache por ejemplo, Dockerfile incluido ejecuta supervisord, y el archivo supervisord.conf especifica que se ejecuten tanto hipache como redis-server.


Estoy totalmente en desacuerdo con algunas soluciones anteriores que recomendaban ejecutar ambos servicios en el mismo contenedor. Hay buenos casos de uso para supervisord o programas similares pero ejecutar una aplicación web + base de datos no es parte de ellos.

Definitivamente debe usar docker-componte para hacer eso.


Pueden estar en contenedores separados, y de hecho, si la aplicación también se diseñó para funcionar en un entorno más grande, probablemente lo estarían.

Un sistema de varios contenedores requeriría más orquestación para poder desplegar todas las dependencias requeridas, aunque en Docker v0.6.5 +, hay una nueva facilidad para ayudar con eso integrado en Docker: Linking . Sin embargo, con una solución de varias máquinas, todavía es algo que tiene que organizarse desde fuera del entorno de 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 se recomienda, 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 otra vez, algo con lo que Linking puede ayudar.

Para una instalación más simple y pequeña, donde todas las dependencias van en el mismo contenedor, tener la base de datos y el tiempo de ejecución de Python iniciado por el programa que inicialmente se llama como ENTRYPOINT también es posible. Esto puede ser tan simple como un script de shell o algún otro controlador de procesos: Supervisord es bastante popular y existen varios ejemplos en los archivos Docker públicos.


Solo puede haber un ENTRYPOINT, pero ese objetivo generalmente es un script que inicia tantos programas como sea necesario. 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 acoplable que ejecuta mysql, apache y wordpress dentro de un solo contenedor .

Diga, usted tiene una base de datos que es utilizada por 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, entonces 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 se pueden comunicar entre sí cuando se ejecutan en contenedores diferentes:

  1. Use puertos IP expuestos y conéctese a través de ellos.
  2. Las versiones recientes de acoplador admiten enlaces .

Tenía un requisito similar de ejecutar una pila LAMP, Mongo DB y mis propios servicios

Docker es una virtualización basada en sistema operativo, por lo que aísla su contenedor en un proceso en ejecución, por lo tanto, requiere al menos un proceso 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 extendido de Docker, en el cual puede apilar cualquier cantidad de servicios hasta donde SE INICIE POR LO MENOS UN SERVICIO PREVIO, QUE TAMBIÉN HACIA EL FINAL

Así que mi archivo de imagen Docker tiene dos líneas más abajo al final:

COPY myStartupScript.sh /usr/local/myscripts/myStartupScript.sh CMD ["/bin/bash", "/usr/local/myscripts/myStartupScript.sh"]

En mi script, ejecuto todos los MySQL, MongoDB, Tomcat, etc. Al final, ejecuto mi Apache como un hilo de primer plano.

source /etc/apache2/envvars /usr/sbin/apache2 -DFOREGROUND

Esto me permite comenzar todos mis servicios y mantener vivo el contenedor con el último servicio comenzado a estar en primer plano

Espero eso ayude

ACTUALIZACIÓN : desde la última vez que respondí esta pregunta, han aparecido nuevas cosas como la compilación de Docker , que puede ayudarlo a ejecutar cada servicio en su propio contenedor, pero a la vez unirlos como dependencias entre esos servicios, intente saber más acerca de Docker-Componer y úselo, es más elegante a menos que su necesidad no coincida con él.