Je commencerai par admettre que je suis assez nouveau pour Docker et que je peux aborder ce problème à partir d'un mauvais ensemble d'hypothèses ... faites-moi savoir si c'est le cas. J'ai vu beaucoup de discussions sur la façon dont Docker est utile pour le déploiement, mais aucun exemple de la façon dont cela est réellement fait.
Voici comment je pensais que cela fonctionnerait:
- créer le conteneur de données pour contenir certaines données persistantes sur la machine A
- créer le conteneur d'application qui utilise les volumes du conteneur de données
- faire du travail, potentiellement changer les données dans le conteneur de données
- arrêter le conteneur d'application
- valider et baliser le conteneur de données
- pousser le conteneur de données vers un référentiel (privé)
- tirer et exécuter l'image de l'étape 6 sur la machine B
- reprendre là où vous vous étiez arrêté sur la machine B
L'étape clé ici est l'étape 5, qui, selon moi, sauverait l'état actuel (y compris le contenu du système de fichiers). Vous pouvez ensuite pousser cet état vers un référentiel et le retirer ailleurs, vous donnant un nouveau conteneur qui est essentiellement identique à l'original.
Mais cela ne semble pas fonctionner de cette façon. Ce que je trouve, c'est que l'étape 5 ne fait pas ce que je pense ou l'étape 7 (tirer et exécuter l'image) "réinitialise" le conteneur à son état initial.
J'ai mis en place un ensemble de trois images et conteneurs Docker pour tester cela: un conteneur de données, un écrivain qui écrit une chaîne aléatoire dans un fichier dans le conteneur de données toutes les 30 s, et un lecteur qui évalue simplement echo
la valeur des données fichier conteneur et quitte.
Conteneur de données
Créé avec
docker run \
--name datatest_data \
-v /datafolder \
myrepository:5000/datatest-data:latest
Dockerfile:
FROM ubuntu:trusty
# make the data folder
#
RUN mkdir /datafolder
# write something to the data file
#
RUN echo "no data here!" > /datafolder/data.txt
# expose the data folder
#
VOLUME /datafolder
Écrivain
Créé avec
docker run \
--rm \
--name datatest_write \
--volumes-from datatest_data \
myrepository:5000/datatest-write:latest
Dockerfile:
FROM ubuntu:trusty
# Add script
#
ADD run.sh /usr/local/sbin/run.sh
RUN chmod 755 /usr/local/sbin/*.sh
CMD ["/usr/local/sbin/run.sh"]
run.sh
#!/bin/bash
while :
do
sleep 30s
NEW_STRING=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 32 | head -n 1)
echo "$NEW_STRING" >> /datafolder/data.txt
date >> /datafolder/data.txt
echo "wrote '$NEW_STRING' to file"
done
Ce script écrit une chaîne aléatoire et la date / heure /datafolder/data.txt
dans le conteneur de données.
Lecteur
Créé avec
docker run \
--rm \
--name datatest_read \
--volumes-from datatest_data \
myrepository:5000/datatest-read:latest
Dockerfile:
FROM ubuntu:trusty
# Add scripts
ADD run.sh /run.sh
RUN chmod 0777 /run.sh
CMD ["/run.sh"]
run.sh:
#!/bin/bash
echo "reading..."
echo "-----"
cat /datafolder/data.txt
echo "-----"
Lorsque je crée et exécute ces conteneurs, ils fonctionnent correctement et fonctionnent comme je m'y attendais:
Stop & Start sur la machine de développement:
- créer le conteneur de données
- exécuter l'écrivain
- lancez le lecteur immédiatement, voir le "pas de données ici!" message
- Attends un moment
- exécuter le lecteur, voir la chaîne aléatoire
- arrêter l'écrivain
- redémarrer l'écrivain
- exécuter le lecteur, voir la même chaîne aléatoire
Mais commettre et pousser ne fait pas ce que j'attends:
- créer le conteneur de données
- exécuter l'écrivain
- lancez le lecteur immédiatement, voir le "pas de données ici!" message
- Attends un moment
- exécuter le lecteur, voir la chaîne aléatoire
- arrêter l'écrivain
- valider et baliser le conteneur de données avec
docker commit datatest_data myrepository:5000/datatest-data:latest
- pousser vers le référentiel
- supprimer tous les conteneurs et les recréer
À ce stade, je m'attends à exécuter le lecteur et à voir la même chaîne aléatoire, car le conteneur de données a été validé, poussé vers le référentiel, puis recréé à partir de la même image dans le référentiel. Cependant, ce que je vois en fait, c'est "pas de données ici!" message.
Quelqu'un peut-il expliquer où je me trompe ici? Ou, sinon, montrez-moi un exemple de la façon dont le déploiement se fait avec Docker?
/bin/true
binaire (ou tout autre) de toute façondocker rm -v
commande sur le dernier conteneur pour supprimer également un volume)Vous pouvez également utiliser un conteneur de données Docker pour déployer le code
Je ne sais pas si c'est une bonne pratique, mais je le fais comme ça:
Vous pouvez maintenant pousser votre image et utiliser des volumes-from, etc ...
la source
COPY
ouADD
et créer le volume en utilisantVOLUME
dans le Dockerfile.