web-dev-qa-db-fra.com

Je perds mes données à la sortie du conteneur

Malgré le Tutoriel interactif et faq de Docker, je perds mes données lorsque le conteneur se ferme.

J'ai installé Docker comme décrit ici: http://docs.docker.io/en/latest/installation/ubuntulinux Sans aucun problème sur Ubuntu 13.04.

Mais il perd toutes les données lorsqu'il quitte.

iman@test:~$ Sudo docker version
Client version: 0.6.4 
Go version (client): go1.1.2 
Git commit (client): 2f74b1c 
Server version: 0.6.4 
Git commit (server): 2f74b1c 
Go version (server): go1.1.2 
Last stable version: 0.6.4 


iman@test:~$ Sudo docker run ubuntu ping
2013/10/25 08:05:47 Unable to locate ping 
iman@test:~$ Sudo docker run ubuntu apt-get install ping
Reading package lists... 
Building dependency tree... 
The following NEW packages will be installed: 
  iputils-ping 
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. 
Need to get 56.1 kB of archives. 
After this operation, 143 kB of additional disk space will be used. 
Get:1 http://archive.ubuntu.com/ubuntu/ precise/main iputils-ping AMD64 3:20101006-1ubuntu1 [56.1 kB] 
debconf: delaying package configuration, since apt-utils is not installed 
Fetched 56.1 kB in 0s (195 kB/s) 
Selecting previously unselected package iputils-ping. 
(Reading database ... 7545 files and directories currently installed.) 
Unpacking iputils-ping (from .../iputils-ping_3%3a20101006-1ubuntu1_AMD64.deb) ... 
Setting up iputils-ping (3:20101006-1ubuntu1) ... 
iman@test:~$ Sudo docker run ubuntu ping
2013/10/25 08:06:11 Unable to locate ping 
iman@test:~$ Sudo docker run ubuntu touch /home/test
iman@test:~$ Sudo docker run ubuntu ls /home/test
ls: cannot access /home/test: No such file or directory 

Je l'ai également testé avec des sessions interactives avec le même résultat. Ai-je oublié quelque chose?

EDIT: IMPORTANT POUR LES NOUVEAUX UTILISATEURS DE DOCKER

Comme @ mohammed-noureldin et d’autres ont dit, c’est en fait ET NON un conteneur sortant. Chaque fois, il crée simplement un nouveau conteneur.

319
iman

Vous devez commettre les modifications que vous apportez au conteneur, puis l'exécuter. Essaye ça:

Sudo docker pull ubuntu

Sudo docker run ubuntu apt-get install -y ping

Ensuite, récupérez l'ID du conteneur en utilisant cette commande:

Sudo docker ps -l

Valider les modifications dans le conteneur:

Sudo docker commit <container_id> iman/ping 

Puis lancez le conteneur:

Sudo docker run iman/ping ping www.google.com

Cela devrait marcher.

346
Unferth

Lorsque vous utilisez docker run pour démarrer un conteneur, il crée en réalité crée un nouveau conteneur} _ sur la base de l'image que vous avez spécifiée.

Outre les autres réponses utiles ici, notez que vous pouvez redémarrer un conteneur existant après sa fermeture et que vos modifications sont toujours présentes.

docker start f357e2faab77 # restart it in the background
docker attach f357e2faab77 # reattach the terminal & stdin
324
ZeissS

Il existe différentes manières de conserver les données du conteneur:

  1. Volumes Docker

  2. Docker commit

    a) créer un conteneur à partir d’image Ubuntu et exécuter un terminal bash.

       $ docker run -i -t ubuntu:14.04 /bin/bash
    

    b) À l'intérieur du terminal, installez curl

       # apt-get update
       # apt-get install curl
    

    c) Quittez le terminal à conteneurs

       # exit
    

    d) Prenez note de votre identifiant de conteneur en exécutant la commande suivante:

       $ docker ps -a
    

    e) enregistrer le conteneur en tant que nouvelle image

       $ docker commit <container_id> new_image_name:tag_name(optional)
    

    f) vérifiez que vous pouvez voir votre nouvelle image avec curl installé.

       $ docker images           
    
       $ docker run -it new_image_name:tag_name bash
          # which curl
            /usr/bin/curl
    
99

En plus de La réponse de Unferth , il est recommandé de créer un Dockerfile .

Dans un répertoire vide, crée un fichier appelé "Dockerfile" avec le contenu suivant.

FROM ubuntu
RUN apt-get install ping
ENTRYPOINT ["ping"]

Créez une image en utilisant le fichier Dockerfile. Utilisons une balise pour ne pas avoir à mémoriser le numéro d'image hexadécimal.

$ docker build -t iman/ping .

Et puis lancez l'image dans un conteneur.

$ docker run iman/ping stackoverflow.com
54
salathe

Vous voudrez peut-être examiner les volumes de menu fixe si vous souhaitez conserver les données dans votre conteneur. Visitez https://docs.docker.com/engine/tutorials/dockervolumes/ . La documentation de docker est un très bon point de départ

8
Kudzanayi Mutamba

Ma suggestion est de gérer docker, avec docker composer. C'est un moyen facile de gérer tous les conteneurs du menu fixe pour votre projet. Vous pouvez mapper les versions et lier différents conteneurs pour qu'ils fonctionnent ensemble.

Les documents sont très simples à comprendre, mieux que les documents de docker.

Docker-Compose Docs

Meilleur

2
Cam T

J'ai une réponse beaucoup plus simple à votre question, exécutez les deux commandes suivantes

Sudo docker run ubuntu
Sudo docker ps -a

la commande ps -a ci-dessus renvoie une liste de tous les conteneurs. Prenez le nom du conteneur qui référence le nom de l'image - 'ubuntu'. docker auto génère des noms pour les conteneurs, par exemple - 'ubuntu-containername'

Sudo docker start ubuntu-containername

Sudo docker exec -ti ubuntu-containername bash

Cette commande ci-dessus va démarrer le conteneur arrêté et la commande suivante vous aidera à vous connecter au conteneur avec bash Shell. À partir de ce moment, toutes les modifications que vous apportez dans le conteneur sont automatiquement enregistrées par docker. Par exemple - apt-get install curl dans le conteneurVous pouvez quitter le conteneur sans problème, docker auto enregistre les modifications.

Lors de la prochaine utilisation, tout ce que vous avez à faire est d’exécuter ces deux commandes chaque fois que vous souhaitez utiliser ce conteneur.

Sudo docker start ubuntu-containername
Sudo docker exec -ti ubuntu-containername bash
1
Magnus Melwin

Aucune des réponses n'aborde le point de ce choix de conception. Je pense que docker fonctionne de cette façon pour éviter ces 2 erreurs:

  • Redémarrage répété
  • Erreur partielle
0
Minh Nghĩa

une réponse brillante ici Comment continuer un docker qui est sorti de l'utilisateur kgs

docker start $(docker ps -a -q --filter "status=exited")
(or in this case just docker start $(docker ps -ql) 'cos you don't want to start all of them)

docker exec -it <container-id> /bin/bash

Cette deuxième ligne est cruciale. Donc exec est utilisé à la place de run, et non sur une image mais sur un conteneur. Et vous le faites après le démarrage du conteneur.

0
barlop

le problème similaire (et aucun moyen que Dockerfile pourrait résoudre seul) m'a amené à cette page.

stage 0: pour tous, en espérant que Dockerfile puisse résoudre le problème: jusqu'à ce que --dns et --dns-search apparaissent dans le support Dockerfile - il n'y a aucun moyen d'intégrer des ressources intranet.

stage 1: après avoir créé une image à l'aide de Dockerfile (en fait, c'est un problème sérieux. Dockerfile doit être dans le dossier current), avec une image pour déployer ce qui est basé sur l'intranet, en exécutant le script d'exécution de docker . exemple: docker run -d \ --dns=${DNSLOCAL} \ --dns=${DNSGLOBAL} \ --dns-search=intranet \ -t pack/bsp \ --name packbsp-cont \ bash -c " \ wget -r --no-parent http://intranet/intranet-content.tar.gz \ tar -xvf intranet-content.tar.gz \ Sudo -u ${USERNAME} bash --norc"

stage 2: application du script d'exécution du menu fixe en mode daemon fournissant des enregistrements DNS locaux pour pouvoir télécharger et déployer des éléments locaux. 

point important: le script d'exécution devrait se terminer par quelque chose comme /usr/bin/Sudo -u ${USERNAME} bash --norc pour que le conteneur reste actif même après la fin des scripts d'installation. 

no, il est impossible d'exécuter un conteneur en mode interactif pour l'ensemble de l'automatisation, car il restera à l'intérieur de la commande interne doit être Invite jusqu'à ce que CTRL-p CTRL-q soit enfoncé. 

no, si bash n'interagit pas à la fin du script d'installation, le conteneur se terminera immédiatement après l'exécution du script, perdant ainsi tous les résultats de l'installation.

stage 3: le conteneur est toujours en cours d'exécution en arrière-plan, mais il est difficile de savoir s'il a terminé ou non la procédure d'installation. utiliser le bloc suivant pour déterminer la fin de la procédure d’exécution: while ! docker container top ${CONTNAME} | grep "00[[:space:]]\{12\}bash \--norc" - do echo "." sleep 5 done le script ne sera poursuivi qu’après la fin de l’installation. et c’est le bon moment pour appeler: commit, en fournissant l’ID de conteneur actuel ainsi que le nom de l’image de destination (il peut être identique à celui de la procédure build/run mais ajouté avec la balise des objectifs d’installation locale Exemple: docker commit containerID pack/bsp:toolchained. Voir ce lien pour savoir comment obtenir le bon conteneurID

stage 4: le conteneur a été mis à jour avec les installations locales et a été validé dans la nouvelle image attribuée (celle avec la balise fins ajoutée). il est maintenant sûr d'arrêter le conteneur en cours d'exécution. exemple: docker stop packbsp-cont

stage5: chaque fois que le conteneur avec des installations locales nécessite de s'exécuter, démarrez-le avec l'image précédemment enregistrée . exemple: docker run -d -t pack/bsp:toolchained

0
Oleg Kokorin