Cómo copiar imágenes de Docker de un host a otro sin usar un repositorio


1375

¿Cómo transfiero una imagen de Docker de una máquina a otra sin usar un repositorio, sin importar si es privado o público?

Creo mi propia imagen en VirtualBox, y cuando termina, trato de implementarla en otras máquinas para tener un uso real.

Como se basa en mi propia imagen basada (como Red Hat Linux), no se puede recrear desde un Dockerfile. Mi dockerfile no es fácilmente portátil.

¿Hay comandos simples que pueda usar? U otra solución?

Respuestas:


2312

Deberá guardar la imagen de Docker como un archivo tar:

docker save -o <path for generated tar file> <image name>

Luego copie su imagen a un nuevo sistema con herramientas regulares de transferencia de archivos como cp, scpo rsync(preferido para archivos grandes). Después de eso, tendrá que cargar la imagen en Docker:

docker load -i <path to image tar file>

PD: es posible que necesite sudotodos los comandos.

EDITAR: debe agregar el nombre de archivo (no solo el directorio) con -o, por ejemplo:

docker save -o c:/myfile.tar centos:16

27
Esta es la mejor respuesta para las imágenes .
Andy

26
Además, es mejor usar repo:tagcomo referencia de imagen en lugar de image id. Si lo usa image id, la imagen cargada no retendrá la etiqueta (y tendrá que hacer otro paso para etiquetar la imagen).
wisbucky

1
Usé la identificación de la imagen en lugar del nombre: etiqueta Ahora estoy sentado aquí, cargué la imagen y tengo un <ninguno> para REPOSITORY y TAG. ¿Cuál es la forma correcta de recuperar el nombre y la etiqueta? @wisbucky
Ulfhetnar

3
Para etiquetar, primero identifique la ID de IMAGEN usando docker images, luego use docker tag DESIREDIMAGEID mycompany/myreponame. Si la identificación de su imagen es 591de551d6e4, puede abreviar la identificación de la imagen:docker tag 59 mycompany/myreponame
Junior Mayhé

@AndiJay Eche un vistazo a ¿Cómo copiar imágenes de la
duct_tape_coder

582

Transferencia de una imagen de Docker a través de SSH, bzip el contenido sobre la marcha:

docker save <image> | bzip2 | \
     ssh user@host 'bunzip2 | docker load'

También es una buena idea poner pven el medio de la tubería para ver cómo va la transferencia:

docker save <image> | bzip2 | pv | \
     ssh user@host 'bunzip2 | docker load'

(Más información sobre pv: página de inicio , página de manual ).


19
Cuando use docker-machine, puede hacer docker $(docker-machine config mach1) save <image> | docker $(docker-machine config mach2) loadpara copiar imágenes entre las máquinas mach1 y mach2 .
matlehmann

55
@manojlds eval $(docker-machine env dev)es bueno para la comunicación general con un único host acoplable pero no para copiar entre dos máquinas, ya que esto implica dos hosts acoplables / máquinas acopladoras diferentes.
matlehmann

14
hacer esto a la inversa (remoto a local):ssh target_server 'docker save image:latest | bzip2' | pv | bunzip2 | docker load
ThorSummoner

2
¿Hay alguna manera de hacer esto cuando Docker requiere sudo en la máquina de destino? Lo intenté (sin compresión) docker save my_img:v1 | ssh -t -t my_user@my_machine sudo docker load. Sin el modificador "-t", sudo se queja de sudo: lo siento, debes tener un tty para ejecutar sudo ; con un "-t" es el mismo mensaje porque ssh dice que Pseudo-terminal no se asignará porque stdin no es un terminal. y finalmente, con dos "-t" s, obtengo el contenido del archivo tar (es decir, la imagen) en mi terminal. ¿Algunas ideas?
hambre

1
@JosefStark Necesitaba agregar "Valores predeterminados: <nombre de usuario objetivo>! Requiretty" al editar el archivo sudoers para detener el mensaje "Lo siento" de sudo. No sé qué diferencia hay, pero también pongo todo después de las comillas user @ host (así que "[...] | ssh user @ host 'bunzip2 | sudo docker load'").
VirtualWolf

99

Para guardar una imagen en cualquier ruta de archivo o lugar NFS compartido, consulte el siguiente ejemplo.

Obtenga la identificación de la imagen haciendo:

sudo docker images

Digamos que tiene una imagen con id "datos de matriz".

Guarde la imagen con id:

sudo docker save -o /home/matrix/matrix-data.tar matrix-data

Copie la imagen de la ruta a cualquier host. Ahora importe a su instalación local de Docker usando:

sudo docker load -i <path to copied image file>

34

Primero guarde la imagen de Docker en un archivo zip:

docker save <docker image name> | gzip > <docker image name>.tar.gz

Luego cargue la imagen exportada a Docker usando el siguiente comando:

zcat <docker image name>.tar.gz | docker load

11
Para cargar, docker load < my-image.tar.gzes suficiente. La imagen se descomprime automáticamente para gzip, bzip2 y xz.
Flujo

32

correr

docker images

para ver una lista de las imágenes en el host. Digamos que tienes una imagen llamada awesomesauce . En su terminal, cdal directorio donde desea exportar la imagen. Ahora ejecuta:

docker save awesomesauce:latest > awesomesauce.tar

Copie el archivo tar en una memoria USB o lo que sea, y luego cópielo en la nueva computadora host.

Ahora desde el nuevo host hacer:

docker load < awesomesauce.tar

Ahora ve a tomar un café y lee Hacker News ...


44
Vale la pena señalar aquí que esto solo funcionará si guardar y cargar se ejecutan en el mismo sistema operativo. Use docker save [image] -o file.tary docker load -i file.tarpara evitar esto!
Andreas Forslöw

docker save [image] -o file.tartambién parece ser mucho más rápido
ti7

19

Para una exportación aplanada del sistema de archivos de un contenedor, use;

docker export CONTAINER_ID > my_container.tar

Use cat my_container.tar | docker import -para importar dicha imagen.


99
será cat my_container.tar | docker import - my_container:newsi se importan localmente según la ayuda de cmd
Larry Cai

77
Esto es más para hacer una copia de seguridad de un contenedor en ejecución que para implementar una imagen.
Kousha

15

Cuando use docker-machine, puede copiar imágenes entre máquinas mach1y mach2con:

docker $(docker-machine config <mach1>) save <image> | docker $(docker-machine config <mach2>) load

Y, por supuesto, también puede quedarse pven el medio para obtener un indicador de progreso:

docker $(docker-machine config <mach1>) save <image> | pv | docker $(docker-machine config <mach2>) load

También puede omitir una de las docker-machine configsubcapas, para usar su docker-host predeterminado actual.

docker save <image> | docker $(docker-machine config <mach>) load

copiar la imagen del actual docker-host a mach

o

docker $(docker-machine config <mach>) save <image> | docker load

copiar desde el machdocker-host actual.


10

Supongo que necesita guardar, couchdb-cartridgeque tiene una identificación de imagen 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

Guarde la imagen archiveName en un archivo tar. Usaré /media/sf_docker_vm/para guardar la imagen.

stratos@Dev-PC:~$ docker save imageID > /media/sf_docker_vm/archiveName.tar

Copiar el archivo archiveName.tar a la nueva instancia del estibador usando cualquier método que funcione en su entorno, por ejemplo FTP, SCP, etc.

Ejecute el docker loadcomando en su nueva instancia de Docker y especifique la ubicación del archivo tar de imagen.

stratos@Dev-PC:~$ docker load < /media/sf_docker_vm/archiveName.tar

Finalmente, ejecute el docker imagescomando para verificar que la imagen ahora esté 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

Encuentra esta publicación detallada .


10

Para transferir imágenes desde su instalación local de Docker a una máquina virtual de minikube:

docker save <image> | (eval $(minikube docker-env) && docker load)

10

docker-push-ssh es una utilidad de línea de comandos que creé solo para este escenario.

Configura un registro Docker privado temporal en el servidor, establece un túnel SSH desde su host local, empuja su imagen y luego se limpia después de sí mismo.

El beneficio de este enfoque docker save(al momento de escribir la mayoría de las respuestas está usando este método) es que solo las nuevas capas se envían al servidor, lo que resulta en una carga MUCHO más rápida.

A menudo, usar un registro intermedio como dockerhub es indeseable y engorroso.

https://github.com/brthor/docker-push-ssh

Instalar en pc:

pip install docker-push-ssh

Ejemplo:

docker-push-ssh -i ~/my_ssh_key username@myserver.com my-docker-image

La mayor advertencia es que debe agregar manualmente su host local a la insecure_registriesconfiguración de Docker . Ejecute la herramienta una vez y le dará un error informativo:

Error Pushing Image: Ensure localhost:5000 is added to your insecure registries.
More Details (OS X): /programming/32808215/where-to-set-the-insecure-registry-flag-on-mac-os

¿Dónde debo configurar el indicador '--insecure-Registry' en Mac OS?


1
Edité su respuesta para dejar en claro que usted creó la utilidad que recomienda. Consulte esta página , en particular: "Publique respuestas buenas y relevantes, y si algunas (pero no todas) son sobre su producto o sitio web, está bien. Sin embargo, debe revelar su afiliación en sus respuestas".
Louis

8

Todas las demás respuestas son muy útiles. Acabo de pasar por el mismo problema y descubro una manera fácil de hacerlo docker machine scp.

Desde Docker Machine v0.3.0, scp se introdujo para copiar archivos de una máquina Docker a otra. Esto es muy conveniente si desea copiar un archivo de su computadora local a una máquina Docker remota como AWS EC2 o Digital Ocean porque Docker Machine se encarga de las credenciales SSH por usted.

  1. Guarda tus imágenes usando docker savecomo:

    docker save -o docker-images.tar app-web
    
  2. Copie imágenes usando docker-machine scp

    docker-machine scp ./docker-images.tar remote-machine:/home/ubuntu
    

Suponga que su máquina Docker remota es remote-machiney el directorio que desea que sea el archivo tar es /home/ubuntu.

  1. Cargue la imagen de Docker

    docker-machine ssh remote-machine sudo docker load -i docker-images.tar
    

55
¿por qué no solo 'scp <source> <remote>'?
Tamas Kalman

3

Quiero mover todas las imágenes con etiquetas.

```
OUT=$(docker images --format '{{.Repository}}:{{.Tag}}')
OUTPUT=($OUT)
docker save $(echo "${OUTPUT[*]}") -o /dir/images.tar
``` 

Explicación:

Primero OUTobtiene todas las etiquetas pero separadas con nuevas líneas. Segundo OUTPUTobtiene todas las etiquetas en una matriz. Third $(echo "${OUTPUT[*]}")pone todas las etiquetas para un solo docker savecomando para que todas las imágenes estén en un solo alquitrán.

Además, esto se puede comprimir usando gzip. En el objetivo, ejecute:

tar xvf images.tar.gz -O | docker load

-Oopción para tarponer contenidos en stdin que pueden ser tomados por docker load.


2

Puedes usar sshfs:

$ sshfs user@ip:/<remote-path> <local-mount-path>
$ docker save <image-id> > <local-mount-path>/myImage.tar

1

Script para realizar la función de guardar y cargar Docker (probado y probado):

Docker Save:

#!/bin/bash

#files will be saved in the dir 'Docker_images'
mkdir Docker_images
cd Docker_images
directory=`pwd`
c=0
#save the image names in 'list.txt'
doc= docker images | awk '{print $1}' > list.txt
printf "START \n"
input="$directory/list.txt"
#Check and create the image tar for the docker images
while IFS= read -r line
do
     one=`echo $line | awk '{print $1}'`
     two=`echo $line | awk '{print $1}' | cut -c 1-3`
     if [ "$one" != "<none>" ]; then
             c=$((c+1))
             printf "\n $one \n $two \n"
             docker save -o $two$c'.tar' $one
             printf "Docker image number $c successfully converted:   $two$c \n \n"
     fi
done < "$input"

Carga Docker:

#!/bin/bash

cd Docker_images/
directory=`pwd`
ls | grep tar > files.txt
c=0
printf "START \n"
input="$directory/files.txt"
while IFS= read -r line
do
     c=$((c+1))
     printf "$c) $line \n"
     docker load -i $line
     printf "$c) Successfully created the Docker image $line  \n \n"
done < "$input"

0

Puede usar un one-liner con DOCKER_HOSTvariable:

docker save app:1.0 | gzip | DOCKER_HOST=ssh://user@remotehost docker load
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.