J'essaie d'appréhender Docker du point de vue du déploiement d'une application destinée à être exécutée sur le bureau de l'utilisateur. Mon application est simplement une application web flask et une base de données mongo. Normalement, je devrais installer les deux dans une VM et transférer un port hôte à l'application web invitée. J'aimerais essayer Docker mais je ne suis pas sûr de savoir comment utiliser plus d'un programme. La documentation indique qu'il ne peut y avoir qu'un seul point d'entrée, alors comment puis-je avoir Mongo et mon application Flask ? Ou bien doivent-ils être dans des conteneurs séparés, auquel cas comment peuvent-ils communiquer entre eux et comment cela facilite-t-il la distribution de l'application ?
Réponses
Trop de publicités?Docker fournit un quelques exemples sur la façon de le faire. L'option la plus légère est de :
Mettez toutes vos commandes dans un script enveloppant, avec des tests. et de débogage. Exécutez le script enveloppant comme votre
CMD
. Il s'agit d'un un exemple très naïf. D'abord, le wrapper script :
#!/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
Ensuite, le 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
Je suis d'accord avec les autres réponses que l'utilisation de deux conteneurs est préférable, mais si vous avez à cœur de regrouper plusieurs services dans un seul conteneur, vous pouvez utiliser quelque chose comme supervisord.
sur Mal de hanche Par exemple, le fichier Dockerfile inclus exécute supervisord, et le fichier supervisord.conf spécifie que hipache et redis-server doivent être exécutés.
- Réponses précédentes
- Plus de réponses
2 votes
Tout à fait d'accord : je me demande pourquoi les dockers étaient si populaires (processus unique ?) - mais voyons ce que les réponses nous disent