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?
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.
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.
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
Il existe différentes manières de conserver les données du conteneur:
Volumes Docker
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
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
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
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.
Meilleur
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
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:
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.
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