Cómo copiar/mover un contenedor de Docker a otro host

Una fotografía de una persona trabajando en un escritorio de computadora.

Dado que los contenedores de Docker son pequeñas cajas de software, puedes copiarlos y moverlos fácilmente de una computadora a otra. Puede ser que hayas trabajado en una instancia de Docker en tu computadora local y decidiste moverla a un servidor más potente. O tal vez solo quieras desplegar tu contenedor personalizado en múltiples computadoras, “copiar y pegar” a su alrededor. Otras veces, puede que no estés satisfecho con un proveedor de computación en la nube y quieras cambiar a otro diferente. Aquí te mostramos cómo mover la imagen de tu contenedor Docker existente y los volúmenes de datos de un host Linux a otro.

Tabla de Contenidos

  • Guardar la Imagen del Contenedor desde el Host de Origen
  • Exportar un Volumen de Docker desde Tu Contenedor
  • Cargar la Imagen del Contenedor en el Host de Destino
  • Importar un Volumen de Docker a Tu Contenedor
  • Transferir Imagen sin Crear un Archivo
  • Usar Docker Compose para Mover un Despliegue Completo de Docker

Es bueno saber: comienza a trabajar con contenedores instalando Docker en tu distribución de Linux.

Guardar la Imagen del Contenedor desde el Host de Origen

Comienza listando los contenedores de Docker disponibles que se están ejecutando en tu sistema. En mi caso, quiero exportar mi contenedor Docker Nginx a una nueva máquina:

docker ps

Una terminal que resalta los contenedores Docker disponibles para un sistema.

Encuentra el contenedor que deseas copiar y luego detén la instancia:

docker stop NOMBRE_DE_INSTANCIA

Una terminal mostrando la salida del comando docker stop.

Un contenedor Docker se construye a partir de una imagen inicial genérica. Con el tiempo, agregas tus propios cambios a esta imagen base. Los procesos que se ejecutan dentro del contenedor también pueden guardar sus propios datos o hacer otros cambios. Para preservar todo esto, compromete el estado actual de tu contenedor a una nueva imagen:

docker commit NOMBRE_DE_INSTANCIA miimagencontenedor

Una terminal mostrando la salida del comando docker commit creando una nueva imagen a partir de la que se está ejecutando actualmente.

Ten en cuenta que si la instancia se está ejecutando actualmente, esta acción la pausará mientras se guardan sus contenidos. Si esto es un problema, puedes evitar esta pausa ingresando docker commit -p=false NOMBRE_DE_INSTANCIA miimagencontenedor en su lugar. Sin embargo, no hagas esto a menos que sea absolutamente necesario. Las probabilidades de crear una imagen con datos inconsistentes/incompletos aumentan en este caso.

Ahora, guarda tu imagen de contenedor Docker recién comprometida en un archivo de archivo:

docker save -o miimagencontenedor.tar miimagencontenedor

Usa tu método de transferencia de archivos preferido y copia tu archivo .tar al host donde deseas mover tu contenedor Docker. Por ejemplo, el siguiente comando transfiere mi imagen Docker Nginx usando scp:

scp ./miimagencontenedor.tar [email protected]ón.ip.aquí:/home/ramces/

Exportar un Volumen de Docker desde Tu Contenedor

Uno de los inconvenientes de guardar una imagen de Docker es que no viene con los accesorios de Docker que has configurado junto a tu contenedor. Esto incluye cualquier enlace de red y los volúmenes que has creado para almacenar tus datos persistentes.

Para exportar correctamente tu volumen de datos, primero instala Git en tu máquina local:

sudo apt install git

Ejecuta el siguiente comando para descargar el script de exportación de volúmenes para Docker:

git clone https://github.com/ricardobranco777/docker-volumes.sh.git

Asegúrate de que el script de exportación tenga los bits de permiso correctos, luego copíalo al directorio “/usr/local/bin” de tu máquina:

sudo chmod +x ./docker-volumes.sh/docker-volumes.sh  
sudo cp ./docker-volumes.sh/docker-volumes.sh /usr/local/bin/

Prueba si tu script está funcionando correctamente, luego extrae todos los volúmenes asociados a tu contenedor:

docker-volumes.sh -h  
docker-volumes.sh NOMBRE_DE_INSTANCIA save miimagencontenedor-volumen.tar

Una terminal mostrando el proceso de respaldo de cualquier volumen de datos asociado a un contenedor de Docker.

Envía tus archivos de volúmenes Docker recién archivados a tu máquina remota:

scp ./miimagencontenedor-volumen.tar [email protected]ón.ip.aquí:/home/ramces/

Cargar la Imagen del Contenedor en el Host de Destino

Inicia sesión en tu host remoto, luego ejecuta el siguiente comando para cargarlo en el demonio Docker de tu máquina remota:

docker load -i ./miimagencontenedor.tar

Usa docker create para reinicializar tu imagen de contenedor Docker con sus flags de ejecución originales de tu máquina fuente. Por ejemplo, mi contenedor Docker Nginx originalmente tenía el puerto 80 mapeado al puerto 8080 de mi máquina host:

docker create --name mi-contenedor-nginx -p8080:80 miimagencontenedor

Ejecuta tu nuevo contenedor Docker importado:

docker start mi-contenedor-nginx

Confirma que tu imagen importada está funcionando correctamente listando todos los contenedores activos en el sistema:

docker ps

Una terminal mostrando la misma imagen de contenedor Docker ejecutándose en un sistema diferente.

FYI: convierte tu Raspberry Pi en una galería de fotos portátil capaz instalando Photoprism con Docker.

Importar un Volumen de Docker a Tu Contenedor

Para importar un archivo de volumen Docker .tar, primero descarga Git en tu nuevo host:

sudo apt install git

Al igual que en tu sistema original, descarga el script auxiliar docker-volume.sh, establece sus bits de permisos en “ejecutar”, y luego cópialo al directorio “/usr/local/bin” de tu nueva máquina.

Una terminal mostrando el proceso de obtención e instalación del script de volumen de Docker para respaldar datos asociados con contenedores.

Crea un nuevo contenedor Docker usando tu archivo de imagen exportada:

docker create --name mi-contenedor-nginx -v myvol:/usr/share/nginx/html -p8080:80 miimagencontenedor

Ejecuta el script docker-volume.sh con tu archivo .tar original para cargarlo en el demonio Docker de tu nuevo sistema:

docker-volumes.sh mi-contenedor-nginx load miimagencontenedor-volumen.tar

Inicia tu nuevo contenedor Docker ejecutando el siguiente comando:

docker start mi-contenedor-nginx

Prueba si tu contenedor está cargando tu volumen correctamente observando sus datos de configuración internos:

docker inspect -f'{{ .Mounts }}' mi-contenedor-nginx

Una terminal resaltando los datos del volumen importado en la nueva máquina.

Transferir Imagen sin Crear un Archivo

A veces, tal vez quieras omitir la creación de un archivo miimagencontenedor.tar.gz. Tal vez no tengas suficiente espacio en disco ya que el contenedor tiene muchos datos en él. Puedes guardar, transferir y cargar la imagen en el host de destino en un solo comando. Después de ejecutar el comando docker commit mencionado anteriormente, puedes usar esto:

docker save miimagencontenedor | ssh [email protected]ón.ip docker load

También debería funcionar desde Windows, ya que ahora tiene un cliente SSH incorporado (PuTTY ya no es necesario).

Continúa con el comando docker create que se aplica a tu situación.

Nota: Asegúrate de que has montado correctamente cualquier volumen de Docker que estaba previamente adjunto a tu contenedor antes de iniciar la imagen importada.

Por último, inicia tu nuevo contenedor Docker importado ejecutando docker start seguido del nombre de tu contenedor.

Una terminal mostrando el proceso de iniciar un nuevo contenedor y confirmar que está funcionando correctamente.

Usar Docker Compose para Mover un Despliegue Completo de Docker

Con su plugin Compose, Docker permite construir, configurar y ejecutar programas complejos sin preocuparse por la pila de software subyacente del servidor. Esto, a su vez, te permite construir despliegues de aplicaciones reproducibles en diferentes sistemas Linux.

Para comenzar a migrar tu configuración de Docker existente a Docker Compose, primero asegúrate de que su plugin esté actualmente en tu sistema:

sudo apt install docker-compose-plugin docker-buildx-plugin

Crea una nueva carpeta en tu directorio personal para tu instalación de Docker Compose:

mkdir ~/mi-docker-compose && cd ~/mi-docker-compose

Usa tu editor de texto favorito para crear un archivo “docker-compose.yml” para tu aplicación:

nano ./docker-compose.yml

Pega el siguiente bloque de código dentro de tu archivo de Compose, y luego ajústalo a tus necesidades específicas:

version: '3'  
  
volumes:  
  myvol: # Reemplaza con el nombre de tu volumen importado.  
  
services:  
  nginx:  
    image: miimagencontenedor # Reemplaza con el nombre de tu imagen Docker importada.  
    ports:  
      - "8080:80"  
    volumes:  
      - myvol:/usr/share/nginx/html # Reemplaza "myvol" con el nombre de tu imagen montada.

Guarda tu nuevo archivo de Compose, luego ejecuta el siguiente comando para iniciarlo:

docker compose up -d

Por último, prueba si tu despliegue de Compose está funcionando correctamente. En mi caso, probaré mi contenedor Docker Nginx abriendo un navegador web y navegando a “localhost:8080.”

Una captura de pantalla mostrando el contenedor Docker Nginx importado funcionando correctamente en su nuevo host.

Aprender a copiar y mover tu contenedor Docker a otros hosts de Linux es solo una de las pocas tareas que puedes realizar con tu máquina. Explora este maravilloso mundo de autoalojamiento instalando un servidor de Minecraft en Linux usando Docker.

Crédito de imagen: Max Duzij vía Unsplash. Todas las alteraciones y capturas de pantalla por Ramces Red.