C'est une question très fondamentale, mais je me bats un peu et je voudrais m'assurer de bien comprendre.
Après le démarrage d'un conteneur à partir d'une image et certaines modifications apportées aux fichiers (par exemple: certaines données stockées dans la base de données d'une application Web exécutée sur le conteneur), quelle est la façon appropriée de continuer à travailler avec la même date entre l'arrêt et le redémarrage du conteneur?
Ma compréhension est-elle correcte qu'une fois le conteneur arrêté/terminé (c'est-à-dire: quitter après une session interactive), alors ce conteneur est parti avec toutes les modifications de fichier? Donc, si je veux conserver certains changements de fichier, je dois valider l'état du conteneur dans une nouvelle image/nouvelle version de l'image?
Merci, Julian
Ma compréhension est-elle correcte qu'une fois le conteneur arrêté/terminé (c'est-à-dire: quitter après une session interactive), alors ce conteneur est parti avec toutes les modifications de fichier?
Non, un conteneur persiste après sa sortie, sauf si vous l'avez démarré à l'aide de --rm
argument à docker run
. Considère ceci:
$ docker run -it busybox sh
/ # date > example_file
/ # exit
Puisque nous exit
ed notre Shell, le conteneur n'est plus en cours d'exécution:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
Mais si nous avions le -a
option, on le voit:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
79aee3e2774e busybox:latest "sh" About a minute ago Exited (0) 54 seconds ago loving_fermat
Et nous pouvons le redémarrer et le rattacher:
$ docker start 79aee3e2774e
$ docker attach 79aee3e2774e
<i press RETURN>
/ #
Et le fichier que nous avons créé plus tôt est toujours là:
/ # cat example_file
Wed Feb 18 01:51:38 UTC 2015
/ #
Vous pouvez utiliser le docker commit
commande pour enregistrer le contenu du conteneur dans une nouvelle image, que vous pouvez ensuite utiliser pour démarrer de nouveaux conteneurs, ou partager avec quelqu'un d'autre, etc. Notez cependant que si vous vous retrouvez régulièrement en utilisant docker commit
vous ne vous rendez probablement pas service. En général, il est plus facile de considérer les conteneurs comme étant en lecture seule et de générer de nouvelles images en utilisant un Dockerfile et docker build
.
En utilisant ce modèle, data est généralement conservé à l'extérieur du conteneur, soit via des montages de volume hôte, soit à l'aide d'un conteneur de données uniquement.
Vous pouvez voir les conteneurs finis avec docker ps -a
Vous pouvez enregistrer un conteneur fini, avec les modifications du système de fichiers, dans une image à l'aide de docker commit container_name new_image_name
Vous pouvez également extraire des fichiers de données du conteneur fini avec: docker cp containerID:/path/to/find/files /path/to/put/copy
Notez que vous pouvez également "planifier à l'avance" et éviter de piéger les données dont vous aurez besoin de façon permanente dans un conteneur temporaire en faisant monter par le conteneur un répertoire à partir de l'hôte, par ex.
docker run -v /dir/on/Host:/dir/on/container -it ubuntu:14.04