web-dev-qa-db-fra.com

Les conteneurs Docker conservent-ils les modifications de fichiers?

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

33
Julian Cerruti

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 exited 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.

50
larsks

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 
13
Paul