Una vez que tienes un Dockerfile, lo conviertes en una imagen con un motor de contenedores. Docker y Podman aceptan comandos casi idénticos, así que en el examen normalmente puedes escribir lo mismo con cualquiera de las dos herramientas. Podman funciona sin un daemon central y puede ejecutarse sin root (rootless), pero para construir, etiquetar y mover imágenes el flujo de trabajo es el mismo.
docker build -t myapp:1.0 . construye una imagen. La opción -t le da un nombre y una etiqueta, y el . final es el contexto de build: el directorio cuyos archivos se envían al builder y pueden referenciarse con COPY. Si el Dockerfile tiene otro nombre o ubicación, apúntalo con -f path/to/Dockerfile. Un archivo .dockerignore en el contexto mantiene fuera del build los archivos grandes o secretos, como .git o credenciales locales.
Una referencia de imagen tiene la forma registry/repository:tag, por ejemplo registry.example.com/team/myapp:1.0. Si omites el registry, se asume Docker Hub; si omites la etiqueta, se asume latest. Una etiqueta es solo un rótulo movible que apunta a una imagen; la identidad inmutable es el digest del contenido, escrito myapp@sha256:.... docker tag myapp:1.0 registry.example.com/team/myapp:1.0 agrega un segundo nombre a la misma imagen sin copiar nada, algo que haces antes de docker push a un registry.
A veces no hay registry, por ejemplo en un host aislado (air-gapped) o en una tarea del examen que te pide exportar una imagen. docker save -o myapp.tar myapp:1.0 escribe la imagen, con todas sus capas y etiquetas, en un archivo tar. docker load -i myapp.tar la importa en otra máquina. Podman admite los mismos comandos save y load, y además puede guardar en formato OCI (Open Container Initiative) con --format oci-archive. No los confundas con docker export y docker import, que trabajan con el sistema de archivos aplanado de un contenedor y pierden el historial de la imagen y metadatos como CMD.
docker build -t myapp:1.0 .
docker tag myapp:1.0 myapp:latest
docker images | grep myapp
docker save -o /tmp/myapp.tar myapp:1.0
docker load -i /tmp/myapp.tar
En un clúster local, los nodos no ven las imágenes de tu estación de trabajo. Con kind ejecutas kind load docker-image myapp:1.0; con minikube puedes usar minikube image load myapp:1.0. En la especificación del Pod, define imagePullPolicy: IfNotPresent o Never para que el kubelet use la imagen cargada en lugar de intentar descargarla. Ten en cuenta que para una imagen con la etiqueta latest (o sin etiqueta), la política de descarga por defecto es Always, que fallará si la imagen existe solo localmente.
Comandos útiles de inspección son docker images (o podman images) para listar imágenes, docker image inspect para ver el ENTRYPOINT, CMD, entorno y puertos expuestos configurados, y docker history para ver las capas y sus tamaños.
Términos clave
- Build context (contexto de build)
- El directorio enviado al builder cuyos archivos pueden alcanzar COPY y ADD.
- Tag (etiqueta)
- Un rótulo legible y movible, como 1.0, que apunta a una imagen.
- Digest
- El hash de contenido sha256 inmutable que identifica una imagen de forma única.
- docker save / load
- Comandos que exportan imágenes con todas sus capas y metadatos a un archivo tar y las vuelven a importar.
Una tarea al estilo del examen dice: construye la imagen desde /opt/app con el nombre webapp y la etiqueta v2, luego guárdala en /opt/webapp-v2.tar. Ejecutas podman build -t webapp:v2 /opt/app seguido de podman save -o /opt/webapp-v2.tar webapp:v2, y luego verificas con ls -lh /opt/webapp-v2.tar.
save (imagen con capas y metadatos), no export (el sistema de archivos plano de un contenedor). Lee también la etiqueta exacta y la ruta de salida que pide la tarea.Comprueba lo que sabes
¿Qué significa el punto final en docker build -t app:1 .?
Establece el contexto de build en el directorio actual, que se envía al builder y es desde donde COPY puede leer.
Cargaste una imagen llamada app:latest en kind pero el Pod muestra ErrImagePull. ¿Por qué?
Para una etiqueta latest la imagePullPolicy por defecto es Always, así que el kubelet intenta usar un registry; define imagePullPolicy en IfNotPresent o Never, o usa una etiqueta específica.
¿docker tag copia la imagen?
No, solo agrega otro nombre que apunta al mismo contenido de la imagen.