Skip to main content

[SOLVED] Where are Docker images stored on the host machine? - docker

[SOLVED] Discovering the Location of Docker Images on Your Host Machine

In Docker, knowing where we store our Docker images on the host machine is very important. It helps us manage containers better and fix problems more easily. This chapter will help us understand how Docker stores images. We will look at different ways to find and manage these images. We will learn about Docker’s setup, its storage drivers, and find practical ways to check and change where our images are stored.

Here’s what we will talk about in this guide on Docker image storage:

  • Solution 1: Learn about Docker’s Storage Drivers
  • Solution 2: Find Docker Images in the Default Folder
  • Solution 3: Use Docker Commands to Check Images
  • Solution 4: Look for the Image Layer File Structure
  • Solution 5: Change Docker’s Storage Location
  • Solution 6: Check Disk Usage of Docker Images

By the end of this chapter, we will understand where Docker images are kept on our host machine. We will also know how to manage them well. If we want to know more about how to copy Docker images or how to communicate between Docker containers, this guide will be helpful. Let’s get started!

Solution 1 - Understanding Docker’s Storage Drivers

Docker uses storage drivers to control how we store images and containers on the host filesystem. Each storage driver has a unique way of handling data. This can change performance, compatibility, and how we store images. Here are the main Docker storage drivers we often use:

  1. overlay2: This is the best storage driver for new Linux distributions. It supports a layered filesystem. This means it helps us store and manage image layers efficiently.
  2. aufs: This is an older driver that also supports a layered filesystem. It can be fast but is not supported on all Linux distributions.
  3. btrfs: This filesystem has advanced features like snapshots and subvolumes. It is useful for managing large datasets.
  4. devicemapper: This driver uses block storage. We often see it in production environments that need a lot of data storage.
  5. zfs: Like btrfs, it has features such as snapshots and replication. This makes it good for enterprise-level applications.

To find out which storage driver our Docker installation is using, we can run this command:

docker info | grep "Storage Driver"

This command will show us something like:

Storage Driver: overlay2

Knowing our storage driver is important for improving Docker performance. It also helps us understand where Docker images are stored on the host machine. Each driver stores images in its own place. We can learn more about how Docker images and storage work in the Docker architecture documentation.

Key Points:

  • Each storage driver has different performance effects and abilities.
  • Changing storage drivers may need us to reconfigure Docker and move existing images.
  • We should always check the official Docker storage documentation for detailed help on choosing and setting up storage drivers.

Solution 2 - Locating Docker Images in the Default Directory

We store Docker images on the host machine in a special folder. This folder can change based on the operating system and the Docker storage driver we use. By default, Docker uses the overlay2 storage driver on Linux. The images are in this folder:

  • Linux: /var/lib/docker/overlay2/
  • Windows: C:\ProgramData\Docker\windowsfilter
  • macOS: For Docker Desktop, it uses a virtual machine. Images are inside this VM. We can access them using the Docker CLI, but we can’t see them directly in the host file system.

If we want to find Docker images in the default folder on a Linux system, we can use this command:

ls /var/lib/docker/overlay2/

This command shows all folders under the overlay2 folder. Each folder is a unique image layer or a mix of layers for images.

If we want to check more, we can look at the image folder in the Docker storage path:

ls /var/lib/docker/images/

This folder has information about the images on our system. Each image has a manifest. This includes details like the image ID, repository, and tags.

If we need to look at specific images or layers, we can use the Docker command-line tool. To list images, we can use:

docker images

This command shows all images on the host. It includes their repository names, tags, and IDs. If we want to learn more about a specific image, we can use:

docker inspect <image-id>

We should replace <image-id> with the ID of the image we want to look at. This command gives us detailed info about the image. It includes its size, configuration, and layers.

For more info on how Docker organizes its image layers, we can check the Docker image layering and caching article. This will help us understand how Docker manages the storage of images and layers on our host machine.

Solution 3 - Using Docker Commands to Inspect Images

We can find Docker images on our host machine by using some Docker commands. These commands give us useful information about the images. They help us know where the images are and what their status is.

Inspecting Docker Images

  1. List Docker Images: First, we can list all Docker images on our system with this command:

    docker images

    This command shows a table with details like the repository name, tag, image ID, creation date, and size of each image. The output looks like this:

    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    nginx               latest              4c7e3e3c5c0d        2 days ago         126MB
    ubuntu              20.04               3e6e1cb1f30d        3 weeks ago        72.9MB
  2. Inspect a Specific Image: If we want to know more about a specific image, we can use the docker inspect command with the image name or ID:

    docker inspect <image_name_or_id>

    This command gives us a JSON object with detailed info about the image. It includes configuration, layers, and more. For example:

    docker inspect 4c7e3e3c5c0d

    The output will have properties like:

    [
        {
            "Id": "sha256:4c7e3e3c5c0d...",
            "RepoTags": [
                "nginx:latest"
            ],
            "Created": "2023-10-20T12:34:56.789Z",
            "Size": 126000000,
            "Architecture": "amd64",
            ...
        }
    ]
  3. Get Image Size: To check the size of all images and how much disk space they use, we can run:

    docker system df

    This command gives a summary of space used by images, containers, and volumes. It helps us see how much disk space our Docker images are using.

  4. Explore Image Layers: To see the layers of a specific image, we can use:

    docker history <image_name_or_id>

    For example:

    docker history nginx

    This command shows the history of the image layers. It tells us the commands used to create each layer, the size of each layer, and the timestamps.

  5. Finding Images with Filters: If we want to find specific images based on some criteria, we can use the --filter option. For example, to find images created more than a week ago, we can run:

    docker images --filter "before=ubuntu:20.04"

These Docker commands are important for inspecting images and knowing where Docker images are stored on our host machine. For more info on Docker image management, we can check this guide on Docker image layering and caching.

Solution 4 - Finding the Image Layer File Structure

Docker images use a layered file system. Each layer shows a set of changes to the file system. It is important to understand this structure. This helps us manage Docker images well and fix problems. Here is how we can find and look at the image layer file structure on our host machine.

Locating the Image Layers

  1. Default Storage Path: Docker usually saves images in the /var/lib/docker folder on Linux systems. The path might change based on the operating system and storage driver. For example:

    • Overlay2 Storage Driver:
      • Layers are in /var/lib/docker/overlay2.
    • AUFS Storage Driver:
      • Layers are in /var/lib/docker/aufs/diff.
  2. Understanding the Directory Structure: Each image layer has its own folder. Inside these folders, we can see:

    • diff: This has the actual file changes for the image layer.
    • link: This has links to the parent layers.
    • metadata: This has information about the layer like when it was created and its size.
  3. Inspecting Layer Contents: To check the contents of a certain image layer, we can do these steps:

    • First, we find the image ID of the image we want to explore:

      docker images
    • Next, we use the image ID to find the specific layers:

      docker inspect <image_id>
    • We look for the "Layers" part in the output. This shows the layers for that image.

  4. Accessing Layer Files: We can go to the specific layer folders to see the files. For example, to go to a layer folder:

    cd /var/lib/docker/overlay2/<layer_id>/diff
    ls -la

    We need to change <layer_id> with the actual ID of the layer we want to see.

  5. Using Docker Commands: We can also use the docker history command to see the layers of an image and their sizes:

    docker history <image_name>

    This command gives a list of layers, their sizes, and the commands used to create them.

Example

Here is a simple example. Let’s say we have an image named my-app:

  1. First, we list the images to get the image ID:

    docker images
  2. Next, we inspect the image to find its layers:

    docker inspect my-app
  3. Then we find a layer ID from the output and explore its contents:

    cd /var/lib/docker/overlay2/<layer_id>/diff
    ls -la

Knowing about the image layer file structure helps us manage Docker images better and fix problems related to image storage and retrieval. For more details on Docker image management, we can read about Docker’s image layering and caching.

Solution 5 - Customizing Docker’s Storage Location

By default, Docker keeps its images, containers, and volumes in a certain folder on the host machine. But sometimes, we may want to change Docker’s storage location. We might do this for better organization, to save space, or to use a different filesystem. This solution shows how to change Docker’s storage location easily.

Steps to Customize Docker’s Storage Location

  1. Stop Docker Service: First, we need to stop the Docker service. This helps to avoid any conflicts or problems with data.

    sudo systemctl stop docker
  2. Create a New Directory: Next, we need to choose where we want Docker to store its data. We can create a new directory. For example, if we want to move Docker data to /mnt/docker-data, we can use this command:

    sudo mkdir -p /mnt/docker-data
  3. Move Existing Docker Data: If we already have Docker images and containers, we need to move them to the new folder. The usual Docker storage path is /var/lib/docker. We can move the data with this command:

    sudo rsync -aP /var/lib/docker/ /mnt/docker-data/
  4. Update Docker Configuration: Now, we must tell Docker about the new storage location. We should open the Docker configuration file, which is usually found at /etc/docker/daemon.json. If it does not exist, we can create it:

    sudo nano /etc/docker/daemon.json

    We need to add or change this JSON setting to show the new data folder:

    {
      "data-root": "/mnt/docker-data"
    }
  5. Start Docker Service: After we save the configuration file, we can start the Docker service again:

    sudo systemctl start docker
  6. Verify the Changes: To check if Docker is using the new storage location, we can run this command to see the current data root:

    docker info | grep "Docker Root Dir"

    This should show our new folder, like /mnt/docker-data.

Additional Considerations

  • Permissions: We need to make sure the new folder has the right permissions. This allows the Docker service to read and write data. We can set the correct ownership with:

    sudo chown -R root:docker /mnt/docker-data
  • Backing Up Data: It is a good idea to back up Docker data before we change anything. This helps to prevent losing data if something goes wrong during the move.

By following these steps, we can easily customize Docker’s storage location to fit our needs. This helps us manage and improve performance. For more details about Docker configurations, we can also check out resources on Docker Daemon Configuration and Docker Volume Management.

Solution 6 - Verifying Disk Usage of Docker Images

We need to manage Docker images well. This helps to make sure our host machine has enough disk space. To do this, we should check how much disk space Docker images are using. Docker has built-in commands for us to see the disk space used by images, containers, and volumes.

Step 1: Using Docker System df Command

The docker system df command shows a summary of the disk space used by different Docker parts. This includes images, containers, and volumes. It gives us a quick look at how much disk space is being used.

We can run this command in the terminal:

docker system df

This will show us information like this:

TYPE                TOTAL               ACTIVE              SIZE                RECLAIMABLE
Images              5                   3                   1.5GB              300MB (20%)
Containers          3                   1                   2.1GB              1.5GB (71%)
Local Volumes       2                   2                   800MB              0B (0%)

Step 2: Inspecting Individual Docker Images

If we want to check the disk usage for a specific Docker image, we can use the docker image inspect command. This command gives us detailed information about the image and its size.

To inspect a specific image, we run:

docker image inspect <image_name_or_id>

We need to replace <image_name_or_id> with the name or ID of the image we want to check. The output will show detailed info, including the size of the image in bytes. We can change this to a more readable format.

Step 3: Using Docker Image Prune

If we see that our disk usage is too high and we want to free up space, we can use the docker image prune command. This command removes images that we do not use anymore. It helps us get back disk space.

To remove dangling images (images not tagged and not used by any container), we run:

docker image prune

If we want to remove all unused images, not just the dangling ones, we can add the -a flag:

docker image prune -a

Step 4: Monitoring Disk Usage Regularly

To keep the disk usage of Docker images on our host machine good, we should check the disk space often. We can set up a simple cron job that runs the docker system df command at regular times and logs the output. This helps us see how disk usage changes over time.

For example, to run the command every day at midnight, we can add this line to our crontab:

0 0 * * * /usr/bin/docker system df >> /path/to/logfile.log

Additional Resources

For more advanced ways to manage Docker images and learn about their structure, we can check these links:

By checking and managing disk usage of Docker images often, we can keep our host machine running well and responding quickly.

Conclusion

In this article, we looked at where Docker images are kept on the host machine. We talked about important ideas like Docker’s storage drivers and how to find images in the default folders. We also talked about why it is good to use Docker commands to check images. We learned how to change Docker’s storage place in a smart way. By using these tips, we can handle our Docker images better. If you need more help, you can read our articles on copying Docker images and using Docker commands.

Comments