Skip to content

Docker: Managing Images & Containers

knguyen-hub edited this page Nov 22, 2025 · 1 revision

This guide provides essential Docker commands for managing images and containers, focusing on saving, exporting, deleting, and handling dependencies. Follow the structured sections to efficiently manage your Docker resources.


🚀 Saving & Backing Up Docker Images and Containers

If you need to back up your images and containers (e.g., to a USB drive), follow these steps.

1️⃣ Identify and Mount the Storage Device (Optional)

If saving to an external drive, ensure it's mounted:

lsblk  # Identify the device (e.g., /dev/sdb1)
sudo mkdir -p /mnt/usb
sudo mount /dev/sdb1 /mnt/usb

2️⃣ Save Docker Images

List existing images:

docker images

Save a single image:

docker save -o /mnt/usb/docker_images.tar image_name:tag

Save multiple images:

docker save -o /mnt/usb/docker_images.tar image1:tag1 image2:tag2

3️⃣ Save Docker Containers

List containers:

docker ps -a

If a container has modifications, commit it as an image:

docker commit container_id new_image_name
docker save -o /mnt/usb/docker_containers.tar new_image_name

Alternatively, export the entire container:

docker export -o /mnt/usb/container_backup.tar container_id

4️⃣ Restore Images and Containers

To restore an image:

docker load -i /mnt/usb/docker_images.tar

To restore a container:

docker import /mnt/usb/container_backup.tar new_container_name

🗑 Deleting Docker Images & Containers

When managing disk space, you may need to remove images and containers.

1️⃣ Delete a Docker Image

List images:

docker images

Remove by Image ID:

docker rmi IMAGE_ID

Remove by Repository Name:

docker rmi REPOSITORY:TAG

Force delete an image if it's in use:

docker rmi -f IMAGE_ID

Clean up all unused images:

docker image prune -a

Delete all images (⚠️ Use with caution!):

docker rmi $(docker images -q)

2️⃣ Delete a Docker Container

List all containers:

Stop a running container:

docker stop CONTAINER_ID

Remove a stopped container:

docker rm CONTAINER_ID
docker ps -a

Force remove a running container:

docker rm -f CONTAINER_ID

Remove all stopped containers:

docker container prune

Remove all containers (including running ones):

docker rm -f $(docker ps -aq)

🔗 Handling Parent-Child Dependencies in Docker Images

Docker images inherit layers from parent images, which can cause issues when deleting or modifying them.

1️⃣ Find Child Images That Depend on a Parent

Check which images depend on a specific image:

docker images --filter "since=IMAGE_ID"

2️⃣ Delete an Image That Has Dependent Child Images

If an image cannot be deleted due to child dependencies:

  1. Find and remove child images first:

    docker rmi CHILD_IMAGE_ID
  2. Force delete the parent (if no active dependencies):

    docker rmi -f IMAGE_ID
  3. Delete dangling/unused images:

    docker image prune -a

🔄 Flattening Nested Images to Remove Dependencies

If your images have deep nesting (i.e., multiple dependent images), follow this to flatten them.

1️⃣ Convert Child Images Into Standalone Images

Run containers from each image:

docker run --name temp_container1 -d image1
docker run --name temp_container2 -d image2
docker run --name temp_container3 -d image3
docker run --name temp_container4 -d image4
docker run --name temp_container5 -d image5

Export and import each image to remove parent dependencies:

docker export temp_container1 -o image1.tar
docker export temp_container2 -o image2.tar
docker export temp_container3 -o image3.tar
docker export temp_container4 -o image4.tar
docker export temp_container5 -o image5.tar

cat image1.tar | docker import - new_image1
cat image2.tar | docker import - new_image2
cat image3.tar | docker import - new_image3
cat image4.tar | docker import - new_image4
cat image5.tar | docker import - new_image5

Now, delete the old images:

docker rmi -f image1 image2 image3 image4 image5

Now, each image is fully independent! 🚀


🔍 Checking Actual Parent-Child Dependencies

To find out if an image has a parent:

1️⃣ Check Parent Image

docker inspect --format '{{.Parent}}' IMAGE_ID

If it returns empty (""), the image has no parent.

2️⃣ View Image History

docker history IMAGE_ID

If the image was exported/imported, it will have only one or two layers.

3️⃣ Compare Layer IDs

docker inspect --format='{{.RootFS.Layers}}' IMAGE_ID

Compare with another image:

docker inspect --format='{{.RootFS.Layers}}' parent_image
docker inspect --format='{{.RootFS.Layers}}' child_image

If they share layers, the child depends on the parent.

4️⃣ Show Full Image Dependency Tree

docker images --format "{{.Repository}}:{{.Tag}} {{.ID}} {{.ParentID}}" | column -t

This prints an image-to-parent relationship table.


🏗 Exporting Containers to Images (Flattening & Retaining State)

When you export a container and import it as an image, you get an independent image.

1️⃣ Export & Import a Container as an Image

docker export -o container_backup.tar container_id
cat container_backup.tar | docker import - new_image_name

2️⃣ What Is Preserved?

All installed software inside the container.

All files & modifications made inside the container.

3️⃣ What Is Lost?

Multi-layer caching & build history

ENTRYPOINT, CMD, ENV, EXPOSE settings

To restore missing metadata during import:

docker import container_backup.tar new_image:latest \
  --change='CMD ["/bin/bash"]' \
  --change='ENV APP_ENV=production' \
  --change='EXPOSE 8080'

🎯 Final Takeaways

  • Use docker save/load to retain history and multi-layer caching.
  • Use docker export/import to create fully independent images (but lose metadata).
  • Flatten nested images with docker export/import to remove dependencies.
  • Use docker inspect and docker history to check parent-child relationships.
  • Use docker rmi carefully to avoid dependency issues.

🚀 Now you have full control over your Docker images & containers! 🚀

Clone this wiki locally