Cómo copiar/mover un contenedor Docker a otro host
Dado que los contenedores Docker son pequeñas cajas de software, por así decirlo, puedes copiarlos y moverlos de una computadora a otra. Sin embargo, esto no se discute a menudo, probablemente porque las organizaciones más grandes crean sus propios repositorios, donde pueden personalizar sus propias imágenes y distribuirlas en sus servidores como mejor les parezca. Pero no debería tener que tomarse la molestia de configurar su propia línea de distribución si ocasionalmente necesita mover uno o más contenedores.
Es posible que haya trabajado en una instancia de Docker en su computadora local y haya decidido trasladarla a un servidor más potente. O tal vez simplemente desee implementar su contenedor personalizado en varias computadoras, "copiarlo y pegarlo". En otras ocasiones, es posible que no esté satisfecho con un proveedor de computación en la nube y desee cambiar a otro. Cualquiera que sea la situación, existe un procedimiento bastante sencillo para hacerlo que se detallará a continuación.
Lea también: Cómo configurar WordPress usando Docker en Ubuntu
Guardar imagen de contenedor desde el host de origen
No es necesario detener el contenedor primero, pero se recomienda encarecidamente que lo haga. Tomará una instantánea de los datos en su instancia de Docker. Si se está ejecutando mientras haces esto, existe una pequeña posibilidad de que algunos archivos terminen incompletos en tu instantánea. Imagínese a alguien cargando un archivo de 500 MB. Cuando se hayan cargado 250 MB, emita el comando docker commit
. Luego, la carga continúa, pero cuando restaura esta imagen de Docker en otro host, es posible que solo 250 MB de los 500 MB estén disponibles.
Entonces, si puedes, primero detén la instancia.
docker stop NAME_OF_INSTANCE
Un contenedor Docker se construye a partir de una imagen inicial genérica. Con el tiempo, agrega sus propios cambios a esta imagen base. Los procesos que se ejecutan dentro del contenedor también pueden guardar sus propios datos o realizar otros cambios. Para preservar todo esto, puedes asignar este nuevo estado a una nueva imagen.
Tenga en cuenta que si la instancia se está ejecutando actualmente, esta acción la pausará mientras se guarda su contenido. Si agregó muchos datos a su contenedor, esta operación tardará más en completarse. Si esto es un problema, puede evitar esta pausa ingresando docker commit -p=false NAME_OF_INSTANCE mycontainerimage
en lugar del siguiente comando. Sin embargo, no hagas esto a menos que sea absolutamente necesario. En este caso, aumentan las probabilidades de crear una imagen con datos inconsistentes o incompletos.
En este tutorial, se eligió un nombre genérico para la imagen resultante, mycontainerimage
. Puedes cambiar este nombre si lo deseas. Si lo hace, recuerde reemplazarlo en todos los comandos posteriores donde lo encuentre.
docker commit NAME_OF_INSTANCE mycontainerimage
Ahora, guarde esta imagen en un archivo y comprímala.
docker save mycontainerimage | gzip > mycontainerimage.tar.gz
A continuación, utilice su método de transferencia de archivos preferido y copie mycontainerimage.tar.gz
al host donde desea migrar su contenedor.
Cargar imagen de contenedor en el host de destino
Después de iniciar sesión en el host donde transfirió la imagen, impórtela a Docker.
gunzip -c mycontainerimage.tar.gz | docker load
Como nunca inicializó este contenedor aquí, todavía no puede iniciarlo con docker start
. En su lugar, emita el mismo comando que utilizó en el pasado, cuando ejecutó por primera vez esta instancia de Docker. La única diferencia ahora es que usarás "mycontainerimage" al final en lugar de cualquier imagen que hayas usado en el pasado.
El siguiente comando es sólo un ejemplo; No copie ni pegue esto a menos que se aplique a usted. (No se requirieron parámetros especiales cuando ejecutó la imagen por primera vez)
docker run -d --name=PICK_NAME_FOR_CONTAINER mycontainerimage
En contraste, el siguiente es un ejemplo de un comando donde se requirió el parámetro --publish
para reenviar el puerto 80 en la máquina host al puerto 80 en el contenedor:
docker run -d --name=http-server --publish 80:80 mycontainerimage
Luego, puede detener e iniciar este contenedor normalmente, con los comandos docker stop
y docker start
.
Transferir imagen sin crear un archivo
A veces es posible que desees omitir la creación de un archivo mycontainerimage.tar.gz
. Quizás no tenga suficiente espacio en disco ya que el contenedor contiene muchos datos. Puede guardar, comprimir, transferir, descomprimir y cargar la imagen en el host de destino con un solo comando. Después de ejecutar el comando docker commit
descrito en la primera sección, puede usar esto:
docker save mycontainerimage | gzip | ssh root@203.0.113.1 'gunzip | docker load'
También debería funcionar desde Windows, ya que ahora tiene un cliente SSH integrado (PuTTY ya no es necesario).
Luego, continúe con el comando docker run
que se aplique a su situación.
Conclusión
docker save
y docker load
son excelentes como solución ad hoc para mover contenedores de vez en cuando. Pero recuerde, si hace esto con frecuencia, es posible que desee configurar su propio repositorio privado.
Crédito de imagen: Servicio Médico de la Fuerza Aérea