Comment transférer une image Docker d'une machine à une autre sans utiliser de référentiel, privé ou public?
Je suis habitué à jouer et à créer ma propre image dans VirtualBox. Une fois celle-ci terminée, j'essaie de la déployer sur d'autres machines pour qu'elle soit réellement utilisée.
Comme il est basé sur une image propre (telle que Red Hat Linux), il ne peut pas être recréé à partir d'un fichier Docker.
Existe-t-il des commandes simples que je peux utiliser? Ou une autre solution?
Il semble que la sauvegarde/exportation puisse atteindre un objectif similaire, voir Quelle est la différence entre sauvegarder et exporter dans Docker?, et je préfère la commande save
pour mon cas.
Vous devrez enregistrer l'image Docker en tant que fichier tar:
docker save -o <path for generated tar file> <image name>
Copiez ensuite votre image sur un nouveau système à l'aide d'outils de transfert de fichiers classiques tels que cp
ou scp
. Après cela, vous devrez charger l'image dans Docker:
docker load -i <path to image tar file>
PS: Vous devrez peut-être Sudo
toutes les commandes.
EDIT: Vous devez ajouter le nom de fichier (pas seulement le répertoire) avec -o, par exemple:
docker save -o c:/myfile.tar centos:16
Transférer une image Docker via SSH, bzipper le contenu à la volée:
docker save <image> | bzip2 | \
ssh user@Host 'bunzip2 | docker load'
C'est aussi une bonne idée de mettre pv
au milieu du tuyau pour voir comment se passe le transfert:
docker save <image> | bzip2 | pv | \
ssh user@Host 'bunzip2 | docker load'
(Plus d'infos sur pv
: page d'accueil , page de manuel ).
Pour enregistrer une image dans un chemin de fichier ou un emplacement NFS partagé, voir l'exemple suivant.
Obtenez l'image id en faisant:
Sudo docker images
Supposons que vous ayez une image avec l'id "matrice-données".
Enregistrez l'image avec l'identifiant:
Sudo docker save -o /home/matrix/matrix-data.tar matrix-data
Copiez l'image du chemin d'accès sur n'importe quel hôte. Importez maintenant dans votre installation Docker locale en utilisant:
Sudo docker load -i <path to copied image file>
Commencez par enregistrer l’image Docker dans un fichier Zip:
docker save <docker image name> | gzip > <docker image name>.tar.gz
Chargez ensuite l'image exportée dans Docker à l'aide de la commande ci-dessous:
zcat <docker image name>.tar.gz | docker load
Courir
docker images
pour voir une liste des images sur l'hôte. Disons que vous avez une image appelée awesomesauce. Dans votre terminal, cd
dans le répertoire dans lequel vous voulez exporter l'image. Maintenant, lancez:
docker save awesomesauce:latest > awesomesauce.tar
Copiez le fichier tar sur une clé USB ou autre, puis copiez-le sur le nouvel ordinateur hôte.
Maintenant, à partir du nouvel hôte, faites:
docker load < awesomesauce.tar
Maintenant, allez prendre un café et lisez Hacker News ...
Lorsque vous utilisez docker-machine, vous pouvez utiliser docker $(docker-machine config <mach1>) save <image> | docker $(docker-machine config <mach2>) load
pour copier des images entre les machines mach1
et mach2
.
Et bien sûr, vous pouvez aussi coller pv
au milieu pour obtenir un indicateur de progression:
docker $(docker-machine config <mach1>) save <image> | pv | docker $(docker-machine config <mach2>) load
.
Vous pouvez également omettre l’un des sous-shells docker-machine config
pour utiliser votre hôte de docker par défaut actuel.
docker save <image> | docker $(docker-machine config <mach>) load
pour copier l'image du docker-host actuel vers mach
ou
docker $(docker-machine config <mach>) save <image> | docker load
pour copier de mach
vers l'hôte de docker actuel.
Pour une exportation aplatie du système de fichiers d'un conteneur, utilisez;
docker export CONTAINER_ID > my_container.tar
Utilisez cat my_container.tar | docker import -
pour importer ladite image.
Je suppose que vous devez enregistrer couchdb-cartridge
qui a un identifiant d'image de 7ebc8510bc2c:
stratos@Dev-PC:~$ docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
couchdb-cartridge latest 7ebc8510bc2c 17 hours ago 1.102 GB
192.168.57.30:5042/couchdb-cartridge latest 7ebc8510bc2c 17 hours ago 1.102 GB
ubuntu 14.04 53bf7a53e890 3 days ago 221.3 MB
Enregistrez l'image archiveName dans un fichier tar. Je vais utiliser le /media/sf_docker_vm/
pour enregistrer l'image.
stratos@Dev-PC:~$ docker save imageID > /media/sf_docker_vm/archiveName.tar
Copiez le fichier nom_archive.tar dans votre nouvelle instance Docker en utilisant la méthode qui convient dans votre environnement, par exemple FTP
, SCP
, etc.
Exécutez la commande docker load
sur votre nouvelle instance Docker et spécifiez l'emplacement du fichier tar de l'image.
stratos@Dev-PC:~$ docker load < /media/sf_docker_vm/archiveName.tar
Enfin, exécutez la commande docker images
pour vérifier que l’image est maintenant disponible.
stratos@Dev-PC:~$ docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
couchdb-cartridge latest 7ebc8510bc2c 17 hours ago 1.102 GB
192.168.57.30:5042/couchdb-cartridge latest bc8510bc2c 17 hours ago 1.102 GB
ubuntu 14.04 4d2eab1c0b9a 3 days ago 221.3 MB
S'il vous plaît trouver ce post détaillé .
Pour transférer des images de votre installation Docker locale vers une machine virtuelle minikube:
docker save <image> | (eval $(minikube docker-env) && docker load)
Toutes les autres réponses sont très utiles. Je viens de passer par le même problème et trouver un moyen facile avec docker machine scp
.
Depuis Docker Machine v0.3.0, scp a été introduit pour copier des fichiers d’un ordinateur Docker à un autre. Cela est très pratique si vous souhaitez copier un fichier de votre ordinateur local vers un ordinateur Docker distant tel que AWS EC2 ou Digital Ocean, car Docker Machine s'occupe des informations d'identification SSH pour vous.
Enregistrez vos images en utilisant docker save
comme:
docker save -o docker-images.tar app-web
Copier des images avec docker-machine scp
docker-machine scp ./docker-images.tar remote-machine:/home/ubuntu
Supposons que votre machine Docker distante est remote-machine
et que le répertoire dans lequel vous souhaitez placer le fichier tar est /home/ubuntu
.
Charger l'image de Docker
docker-machine ssh remote-machine Sudo docker load -i docker-images.tar
docker-Push-ssh
est un utilitaire de ligne de commande uniquement pour ce scénario.
Il configure un registre Docker privé temporaire sur le serveur, établit un tunnel SSH à partir de votre hôte local, pousse votre image, puis nettoie après.
L'avantage de cette approche par rapport à docker save
(au moment de la rédaction de cet article, la plupart des réponses utilisent cette méthode) est que seules les nouvelles couches sont placées sur le serveur, ce qui accélère considérablement le téléchargement.
Souvent, utiliser un registre intermédiaire comme dockerhub est indésirable et fastidieux.
https://github.com/coherenceapi/docker-Push-ssh
Installer:
pip install docker-Push-ssh
Exemple:
docker-Push-ssh -i ~/my_ssh_key [email protected] my-docker-image
Le plus gros inconvénient est que vous devez ajouter manuellement votre hôte local à la configuration insecure_registries
de Docker. Exécutez l'outil une fois et cela vous donnera une erreur informative:
Error Pushing Image: Ensure localhost:5000 is added to your insecure registries.
More Details (OS X): https://stackoverflow.com/questions/32808215/where-to-set-the-insecure-registry-flag-on-mac-os
Où dois-je définir le drapeau '--insecure-registry' sur Mac OS?
Vous pouvez utiliser sshfs
:
$ sshfs user@ip:/<remote-path> <local-mount-path>
$ docker save <image-id> > <local-mount-path>/myImage.tar
Je veux déplacer toutes les images avec des balises.
```
OUT=$(docker images --format '{{.Repository}}:{{.Tag}}')
OUTPUT=($OUT)
docker save $(echo "${OUTPUT[*]}") -o /dir/images.tar
```
Explication:
La première OUT
obtient toutes les balises mais séparées par de nouvelles lignes. La seconde OUTPUT
obtient toutes les balises d'un tableau. La troisième $(echo "${OUTPUT[*]}")
place toutes les balises pour une seule commande docker save
de sorte que toutes les images se trouvent dans un seul tar.
De plus, cela peut être compressé avec gzip. Sur la cible, lancez:
tar xvf images.tar.gz -O | docker load
L'option -O
dans tar
place le contenu sur stdin qui peut être récupéré par docker load
.