Las imágenes de Docker son la base de los contenedores de Docker. Dado que las imágenes son la base, ¿alguna vez se ha preguntado cómo actualizar los contenedores de Docker cuando se lanza una nueva versión de una imagen?
¡Extrañar más! En este tutorial, aprenderá cómo actualizar su repositorio de imágenes local de Docker y actualizar sus contenedores a una nueva versión sin estropear las cosas.
Requisitos
Este tutorial será una demostración práctica. Si desea seguirnos, asegúrese de tener lo siguiente:
- Entorno Linux:el tutorial usa Linux (Ubuntu Focal) para ejecutar Docker, pero también puede aplicar los mismos pasos generales a Windows o macOS.
- Instale Docker Engine 20.10.8 (Linux) o Docker Desktop 3.5.2 (macOS y Windows).
Ejecutar imágenes de Docker idempotentes
Una imagen de Docker contiene todo el software necesario para ejecutar la aplicación asociada, incluidos los paquetes y las dependencias del sistema operativo. Docker ensambla imágenes a través de instrucciones dentro de un archivo llamado Dockerfile , que contiene instrucciones de instalación idempotentes.
Una instrucción idempotente implica que la imagen resultante de ejecutar la instrucción de instalación siempre dará como resultado la misma salida.
La ventaja de construir imágenes idempotentes es que son independientes del sistema:la imagen resultante siempre será la misma. La ejecución del contenedor siempre será la misma, sin importar dónde tenga lugar la ejecución.
Una nueva versión de la imagen suele implicar algunas mejoras en las instrucciones para construir la base del contenedor Docker, por ejemplo:
- Una versión más nueva del código fuente de la aplicación puede reemplazar a la anterior;
- Mejor gestión de dependencias:menos espacio requerido o mejor rendimiento;
- Mejor seguridad:la imagen tiene parches de seguridad para evitar vulnerabilidades.
Para obtener los últimos beneficios de cualquier actualización en las imágenes de Docker, debe saber cómo actualizarlas y aplicar esas actualizaciones a sus contenedores.
Actualización de imágenes de Docker local
Para empezar, empiece por actualizar una imagen de Docker local. La aplicación del ejemplo python
El contenedor ejecuta aplicaciones de código Python. Actualizar la imagen local de Docker significa que las aplicaciones pueden confiar en la imagen recién actualizada.
Primero necesita saber qué imágenes están disponibles actualmente en su entorno local. Ejecute el siguiente comando para verificar sus imágenes locales. La ETIQUETA columna indica la versión disponible de la imagen.
docker images

Ahora que tiene su versión local de la imagen, debe buscar la última imagen disponible en un registro remoto. Hay varios registros remotos de Docker (repositorios de imágenes de Docker) que el motor de Docker consulta para actualizar sus imágenes locales. Docker extrae imágenes de DockerHub de forma predeterminada, pero existen múltiples alternativas, la mayoría privadas. Algunos repositorios alternativos se enumeran a continuación.
- Galería pública de ECR de Amazon Web Service (AWS)
- Sonatipo Nexus
- Puerto VM
Navegue por la página del repositorio y busque la imagen deseada:una imagen oficial de Python que actualizará como ejemplo. Escribe python para buscar la imagen deseada en DockerHub y abrirla para encontrar las etiquetas disponibles. Los ejemplos de este tutorial son de una imagen de Python.
Cada etiqueta también tiene una fecha de inserción. La fecha de inserción es la fecha en que se cargó la imagen en el registro. Toma nota de la etiqueta de la imagen y nombre , los cuales necesitará en los siguientes pasos.

Ahora que tiene la etiqueta de versión más reciente, es hora de actualizar la imagen. Para actualizar a una imagen más nueva, primero debe extraer la nueva versión. Ejecute docker pull
comando seguido de dos puntos y el nombre y la etiqueta de la imagen más nueva:el nombre y la etiqueta de los que tomó nota anteriormente. El nombre y la etiqueta del ejemplo es python:slim-buster
. El comando completo y la salida resultante se muestran a continuación.
docker pull python:slim-buster

Para extraer la imagen del registro de imágenes de Docker no predeterminado (DockerHub), debe proporcionar el URI completo de la imagen. Por ejemplo:para sacar Python de (AWS) Galería pública de ECR, ejecute
dockerpull public.ecr.aws/bitnami/python:3.7
Aprender a actualizar contenedores Docker
Una vez que crea un contenedor, la imagen del contenedor no puede cambiar. Dado que la imagen no puede cambiar, realmente no puede actualizar un contenedor en ejecución. Lo que hace es recrear cualquier contenedor en ejecución con contenedores de reemplazo utilizando la versión de imagen más nueva.
Como ya tiene la versión más reciente, es hora de recrear los contenedores con las imágenes antiguas que necesitan actualizarse.
Para encontrar qué contenedores necesita volver a crear, enumere los contenedores existentes que ejecutan la imagen anterior. El docker ps
el comando enumera los contenedores. Con el --filter
marca, usted especifica qué contenedores enumerar. Hay varias opciones disponibles para filtrar y el ancestor
filtros de bandera por la imagen utilizada como base para construir el contenedor. Los contenedores iniciales en los ejemplos son para Python 3.7.2, que aplicará como filtro. El -a
el interruptor muestra todos los contenedores disponibles.
docker ps -a --filter "ancestor=python:3.7.2"

Puede usar la salida de docker ps
como entrada para ejecutar docker stop
Comando en todos los contenedores enumerados. La bandera -q
está incluido, por lo que el comando de listado solo devuelve los ID de los contenedores. El resultado del comando es la lista de ID de los contenedores detenidos.
docker stop $(docker ps -aq --filter "ancestor=python:3.7.2")

Después de detener los contenedores, debe pedirle a Docker que los elimine del sistema antes de eliminar la imagen obsoleta.
docker rm $(docker ps -aq --filter "ancestor=python:3.7.2")

Después de eliminar todos los contenedores asociados con la imagen obsoleta, puede eliminar la imagen antigua con docker rmi
comando.
docker rmi python:3.7.2

Creación de nuevos contenedores con las imágenes actualizadas
Ahora es el momento de reemplazar finalmente los contenedores antiguos, los que se eliminaron anteriormente, con nuevos contenedores basados en la imagen actualizada. Esta vez, creará los contenedores utilizando la versión de imagen más nueva. Dado que los contenedores son idempotentes, puede esperar que todo funcione como antes.
Ejecute el nuevo contenedor con docker run
comando y el nombre y la etiqueta de la imagen actualizada que necesitará el contenedor. En este ejemplo, -it
flag le dice a Docker que ejecute el contenedor en modo interactivo, para que pueda ejecutar comandos dentro del contenedor para verificar cualquier funcionalidad actualizada.
docker run -it python:slim-buster

Tenga en cuenta que el nuevo contenedor de Docker está ejecutando una versión de Python más reciente:la versión 3.9.7.
Conclusión
En este tutorial, echó un vistazo detrás de las cubiertas y aprendió la magia detrás de cómo actualizar los contenedores Docker:¡humo y espejos! ¡No hay actualización! En su lugar, elimine todos los rastros de la versión anterior y reemplácelos con nuevos contenedores utilizando una versión más nueva. Y, gracias a la idempotencia, los contenedores siguen funcionando como de costumbre:¡TA-DA!
Entonces, ¿cuáles son los contenedores que planea actualizar a continuación?