Malgré le tutoriel et la FAQ interactifs de Docker, je perds mes données à la sortie du conteneur.
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 à sa sortie.
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 QUAI
Comme l'ont dit @ mohammed-noureldin et d'autres, ce n'est PAS un conteneur qui sort . Chaque fois, il crée simplement un nouveau conteneur.
Docker
. Je proposerais de conserver le titre et la question d'origine, car les débutants chercheront certainement quelque chose comme ça. Mais, pourquoi n'ajoutez-vous pas quelque chose décrivant vos idées fausses au moment où vous avez écrit le post. Cela aidera à clarifier les choses. C'est notre culture ici à SO ... n'est-ce pas? :-)Réponses:
Vous devez valider les modifications que vous apportez au conteneur, puis l'exécuter. Essaye ça:
Obtenez ensuite l'ID du conteneur à l'aide de cette commande:
Validez les modifications apportées au conteneur:
Exécutez ensuite le conteneur:
Cela devrait fonctionner.
la source
<none>
. Comment puis-je continuer à ajouter la validation au-dessus d'une image existante?Lorsque vous utilisez
docker run
pour démarrer un conteneur, il crée en fait un nouveau conteneur basé sur 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 là.
la source
docker ps
vous montre uniquement les conteneurs Docker en cours d'exécution.docker ps -a
vous montre également ceux qui sont sortis - et que vous pouvez continuer à courir. Une validation n'est nécessaire après chaque exécution que si vous souhaitez y créer un instantané pour une utilisation future, sinon le conteneur lui-même restera pour que vous puissiez continuer à l'utiliser.jenkins
docker de serveur et que je l'exécute sur mon hôte ci et qu'il exécute certains travaux que j'ai et, par conséquent, le serveur jenkins écrit sur le disque certains journaux. maintenant, si mon serveur (qui hébergeait mon docker) est redémarré et que je redémarre mon docker jenkins, cela signifierait-il que j'ai perdu tous les fichiers journaux? si c'est le cas, comment puis-je utiliserjenkins
docker par exemple pour faciliter mon installation jenkins sur CI?docker cp $(docker ps -alq):/path/to/file .
docker run -it --name my_debian debian
et aprèsdocker start my_debian && docker attach my_debian
)Il existe des façons suivantes de conserver les données de conteneur:
Volumes Docker
Docker commit
a) créer un conteneur à partir d'une image ubuntu et exécuter un terminal bash.
b) À l'intérieur du terminal, installez la boucle
c) Sortir du terminal à conteneurs
d) Prenez note de votre identifiant de conteneur en exécutant la commande suivante:
e) enregistrer le conteneur en tant que nouvelle image
f) vérifiez que vous pouvez voir votre nouvelle image avec curl installé.
la source
exit
avantdocker commit
? Merci.docker run
commande, vous exécutez bash dans le conteneur et vous y restez en raison des options-i
et-t
(interactif avec TTY). Cependant, Docker s'exécute sur votre machine, en dehors du conteneur, donc après avoir apporté les modifications nécessaires au conteneur de l'intérieur, pour revenir au shell de votre système, vous devezexit
(ou Ctrl + D) le shell du conteneur. Notez également le#
et$
dans la réponse, qui indiquent les différents shells dans lesquels les commandes sont écrites.docker stop
suivi dedocker start
.En plus de la réponse de Unferth , il est recommandé de créer un Dockerfile .
Dans un répertoire vide, créez un fichier appelé "Dockerfile" avec le contenu suivant.
Créez une image à l'aide du Dockerfile . Utilisons une balise pour ne pas avoir à nous souvenir du numéro d'image hexadécimal.
Et puis exécutez l'image dans un conteneur.
la source
J'ai une réponse beaucoup plus simple à votre question, exécutez les deux commandes suivantes
la commande ps -a ci-dessus renvoie une liste de tous les conteneurs. Prenez le nom du conteneur qui fait référence au nom de l'image - «ubuntu». docker auto génère des noms pour les conteneurs par exemple -
'lightlyxuyzx'
, c'est si vous n'utilisez pas l'option --name.Les options -t et -d sont importantes, le conteneur créé est détaché et peut être reconnecté comme indiqué ci-dessous avec l'option -t.
Avec l'option --name, vous pouvez nommer votre conteneur dans mon cas 'mycontainername'.
et cette commande ci-dessus vous aide à 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
à l'intérieur du conteneur Vous pouvez quitter le conteneur sans aucun problème, docker auto enregistre les modifications.Lors de l'utilisation suivante, il vous suffit d'exécuter ces deux commandes chaque fois que vous souhaitez travailler avec ce conteneur.
Cette commande ci-dessous démarre le conteneur arrêté:
Un autre exemple avec des ports et un espace partagé donné ci-dessous:
Dans mon cas: 7efe2989e877 - est l'image d'un ancien conteneur en cours d'exécution que j'ai obtenu en utilisant
la source
--name
option et avant le nom de l'image, comme ceci:docker run --name mycontainername -t -d ubuntu /bin/bash
Vous souhaiterez peut-être consulter les volumes de docker 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
la source
Ma suggestion est de gérer docker, avec docker compose. Est un moyen facile de gérer tous les conteneurs du docker pour votre projet, vous pouvez mapper les versions et lier différents conteneurs pour travailler ensemble.
Les documents sont très simples à comprendre, mieux que les documents de docker.
Docker-Compose Docs
Meilleur
la source
Il y a vraiment d'excellentes réponses ci-dessus à la question posée. Il n'est peut-être pas nécessaire d'avoir une autre réponse, mais je veux quand même donner mon opinion personnelle sur le sujet dans les mots les plus simples possibles.
Voici quelques points sur les conteneurs et les images qui nous aideront à conclure:
Conclusion :
Comme nous pouvons le voir, un conteneur Docker est indépendant d'une image Docker.
Un conteneur peut être redémarré à condition que l'ID unique de ce conteneur [utiliser
docker ps --all
pour obtenir l'ID] .Toute opération comme la création d'un nouveau répertoire, la création de fichiers, l'installation d'outils, etc. peut être effectuée à l'intérieur du conteneur lorsqu'il est en cours d'exécution. Une fois le conteneur arrêté, il persiste toutes les modifications. L'arrêt et le redémarrage d'un conteneur est comme le redémarrage d'un système informatique.
Un conteneur déjà créé est toujours disponible pour un redémarrage, mais lorsque nous émettons une
docker run
commande, un nouveau conteneur est créé à partir d'une image et, par conséquent, il ressemble à un nouveau système informatique. Les modifications apportées à l'intérieur de l'ancien conteneur - comme nous pouvons le comprendre maintenant - ne sont pas disponibles dans ce nouveau conteneur.Une note finale :
Je suppose qu'il est maintenant évident pourquoi les données semblent être perdues et pourtant elles sont toujours là .. mais dans un autre [ancien] conteneur. Alors, prenez bonne note de la différence dans
docker start
&docker run
command & ne vous y trompez jamais.la source
le problème similaire (et aucun moyen que Dockerfile puisse résoudre à lui seul) m'a amené à cette page.
étape 0: pour tous, en espérant que Dockerfile pourrait y remédier: jusqu'à ce que --dns et --dns-search apparaissent dans la prise en charge de Dockerfile - il n'y a aucun moyen d'intégrer des ressources intranet dans.
étape 1: après avoir créé l'image à l'aide de Dockerfile (à propos, c'est un grave problème, Dockerfile doit être dans le dossier actuel ), avoir 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"
étape 2: application du script d'exécution de docker en mode démon fournissant des enregistrements DNS locaux pour pouvoir télécharger et déployer des éléments locaux.
point important: l' exécution du script doit se terminer par quelque chose comme
/usr/bin/sudo -u ${USERNAME} bash --norc
pour maintenir le conteneur en marche même après la fin des scripts d'installation.non , il n'est pas possible d'exécuter le conteneur en mode interactif pour toute la question de l'automatisation car il restera à l'intérieur de l'invite de commande interne jusqu'à ce que CTRL-p CTRL-q soit pressé.
non , si l'interaction de bash ne sera pas exécutée à la fin du script d'installation, le conteneur se terminera immédiatement après la fin de l'exécution du script, perdant tous les résultats de l'installation.
étape 3: le conteneur est toujours en cours d'exécution en arrière-plan, mais il n'est pas clair si le conteneur a terminé la procédure d'installation ou pas encore. en utilisant 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 continuera plus loin seulement une fois l'installation terminée. et c'est le bon moment pour appeler: commit , en fournissant l'identifiant du conteneur actuel ainsi que le nom de l'image de destination (il peut être le même que sur la procédure de génération / exécution , mais avec la balise de finalisation de l'installation locale. exemple:.docker commit containerID pack/bsp:toolchained
voir ce lien sur comment obtenir un ID de conteneur appropriéétape 4: le conteneur a été mis à jour avec les installations locales ainsi qu'il a été validé dans l'image nouvellement affectée (celle avec la balise fins ajoutée). il est maintenant sûr d'arrêter le fonctionnement du conteneur. exemple:
docker stop packbsp-cont
stage5: à tout moment où le conteneur avec les installations locales doit s'exécuter, démarrez-le avec l'image précédemment enregistrée. exemple:
docker run -d -t pack/bsp:toolchained
la source
une brillante réponse ici Comment continuer un docker qui est sorti de l'utilisateur kgs
Cette deuxième ligne est cruciale. Donc, exec est utilisé à la place de run, et non sur une image mais sur un containerid. Et vous le faites après le démarrage du conteneur.
la source
Aucune des réponses ne répond au point de ce choix de conception. Je pense que Docker fonctionne de cette façon pour éviter ces 2 erreurs:
la source