Dado que los contenedores Docker son pequeñas cajas de software, por así decirlo, puede copiarlos y moverlos de una computadora a otra. Sin embargo, esto no se discute a menudo, probablemente porque las organizaciones más grandes configuran sus propios repositorios, donde pueden personalizar sus propias imágenes y distribuirlas a través de sus servidores como mejor les parezca. Pero no debería tener que pasar por la molestia de configurar su propia línea de distribución si ocasionalmente necesita mover uno o más contenedores.
Puede ser que haya trabajado en una instancia de Docker en su computadora local y haya decidido moverla a un servidor más potente. O tal vez solo desee implementar su contenedor personalizado en varias computadoras, «copiarlo y pegarlo». Otras veces, es posible que no esté satisfecho con un proveedor de computación en la nube y quiera cambiar a otro. Cualquiera que sea la situación, hay un procedimiento bastante simple para hacer esto que se detallará a continuación.
Guardar imagen de contenedor desde el host de origen
No es obligatorio detener el contenedor primero, pero se recomienda enfáticamente que lo haga. Tomará una instantánea de los datos en su instancia de Docker. Si se está ejecutando mientras hace esto, existe una pequeña posibilidad de que algunos archivos terminen incompletos en su instantánea. Imagina a alguien cargando un archivo de 500 MB. Cuando se han cargado 250 MB, emite el docker commit
dominio. Luego, la carga continúa, pero cuando restaura esta imagen de Docker en otro host, es posible que solo estén disponibles 250 MB de los 500 MB.
Entonces, si puede, primero detenga la instancia.
docker stop NAME_OF_INSTANCE
Un contenedor Docker se crea 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 conservar todo esto, puede 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ó una gran cantidad de datos a su contenedor, esta operación tardará más tiempo 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. Las probabilidades de crear una imagen con datos inconsistentes/incompletos aumentan en este caso.
En este tutorial, se ha elegido un nombre genérico para la imagen resultante, mycontainerimage
. Puede cambiar este nombre si lo desea. 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órtelo a Docker.
gunzip -c mycontainerimage.tar.gz | docker load
Dado que nunca inicializó este contenedor aquí, no puede iniciarlo con docker start
aún. 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á «mycontainerimage» al final en lugar de cualquier imagen que haya usado en el pasado.
El siguiente comando es solo un ejemplo; no copie y 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
Como contraste, el siguiente es un ejemplo de un comando donde el parámetro --publish
se requería 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
Posteriormente, puede detener e iniciar este contenedor normalmente, con docker stop
y docker start
comandos
Transferir imagen sin crear un archivo
A veces es posible que desee omitir la creación de un mycontainerimage.tar.gz
expediente. Tal vez 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 docker commit
comando discutido 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 incorporado (PuTTY ya no es necesario).
Posteriormente, continúa con el docker run
comando que se aplica a su situación.
Conclusión
docker save
y docker load
son geniales como una 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.
Credito de imagen: Servicio Médico de la Fuerza Aérea