Putting a Magnifying Glass to Docker with Docker Inspect
If you are looking for a detailed view of all the major components of Docker from Docker images, containers, and so on, the docker inspect command is for you.
In this tutorial, you’ll learn how to find become a sleuth to discover detailed information about many Docker components for debugging, troubleshooting, or just your mere curiosity.
Let’s begin!
Prerequisites
If you’d like to follow along step-by-step, ensure you have the following:
- Docker – This tutorial uses Docker v19.03.11 on Ubuntu 18.04.5 LTS.
- Any Docker image downloaded and available. This tutorial uses the latest NGINX Docker image available on Docker Hub.
- At least one container running on the Docker host.
Inspecting Docker Images with Docker Inspect
The Docker Inspect
can provide information on many different Docker components but let’s first start with one of the most popular components; images. If you’ve downloaded an image, how do you then check for information about that image? Let’s find out.
Assuming you have at least one image on your Docker host, use the inspect
command to query that image. The command below assumes that you have an image called nginx
on your host.
docker image inspect nginx
Once executed, the command above returns a slew of information via JSON about that particular image. Some notable attributes are:
- The image tag.
- The time the image was created.
- The hostname of the associated container with Docker image nginx.
- The network ports the container makes available to the outside network.
- You will also notice the volume(s) attached to the container that belongs to the Docker image nginx.
Getting a detailed view of Docker image using Docker inspect
command.
Getting Detailed Information about Docker Networks
The docker inspect
command isn’t just relegated to grabbing information about images and containers; it can also query networks. Docker networks allow containers to communicate in different ways, such as through a bridge network (a private network), a host network (a public network), or an overlay network.
Knowing Docker networks is important as it allows you to switch to another Docker network anytime as per the need of the application by disconnecting and then connecting back.
Assuming you are still on the terminal:
1. Run the command below. The docker network ls
command lists all the networks present in the Docker. You’ll need the output of this command to find the network’s ID.
docker network ls
Listing the Docker network
Next, pass a network ID to the docker inspect network
command. This command returns various information about the particular network, as shown below.
docker inspect network 4748f122c987
1. The type of network.
2. The subnet address the network uses.
3 and 4. Summary information about every container that’s using this particular network.
Inspecting the Docker network
Understanding Docker’s Go Templates and the Format
Parameter
Up to now, you have learned how to use Docker inspect command without using any additional options parameters. But if you need to manipulate the output format, consider using the --format
flag. The --format
parameter uses Go templates to filter and display the information returned from docker inspect
.
Various functions are used along with the format flag, such as join, println, table, etc. Let’s discuss a few of them!
For example, maybe you want to join some values together from the output from a particular container. If so, the join
command works well. Below, you’ll see that the join
command concatenates strings together (nginx, -g, daemon off
) with each element separated by a separator (,
).
docker inspect --format '{{join .Args " , "}}' container_id
Demonstrating the join format function for Docker Inspect.
Maybe you’d like to capitalize a value? Use the upper
command.
docker inspect --format "{{upper .Name}}" container_id
Demonstrating the upper command format function for Docker Inspect.
You can find many different examples of using the format
parameter.
Finding a Docker Container’s Base Image Name
In the previous section, you saw how to get a detailed view of all your Docker images, including the containers using those images. But what if you already know a container ID and need to find the image that it was created from quickly? You can provide the container ID to docker inspect
.
To find the name of the image that a particular container is built from, run the below docker inspect
command. The below command passes the container ID (8f34d039fa3a
in this case) to docker inspect
and uses the format
parameter to only return the image
value from the Config
node in the JSON output.
# 8f34d039fa3a is the container represented with ContainerID.
docker inspect --format='{{.Config.Image}}' 8f34d039fa3a
Docker inspect command that shows nginx
image
You can see what the entire Config
node looks like below and where the Image
name comes from.
Finding the name of the Image used by Container
Finding a Container’s IP Address, Mac Address, and Port Bindings
Although you now know how to find the network a container uses, how do you know what IP address or Mac Address, and Port Bindings on that network a container uses? You guessed it! docker inspect
.
To narrow down the IP address that a container uses, pass the container ID to the docker inspect
command. Again, use the format
parameter to filter out the unwanted JSON to get down to exactly what you’re looking for.
You’ll see the format
parameter argument below tells docker inspect
only to return the value embedded inside the NetworkSettings
→Networks
→ IPAddress
JSON attribute using the range
attribute. Range attribute allows you to iterate over an array, setting the.
value to each array element.
docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' my_container
Finding the IP address using Docker inspect command.
You’ll see the main NetworkSettings
node below and where the IPAddress
value is nested.
Inspecting the NetworkSettings values from Docker Inspect.
Similarly, to find the MAC address of the container, use docker inspect
container command as shown below.
Again, You’ll see that the format
parameter argument below uses the range
attribute but this time, find the container’s Mac address by checking in NetworkSettings
→Networks
→ Mac address
.
docker inspect --format='{{range .NetworkSettings.Networks}}{{.MacAddress}}{{end}}' 3dd206041249
Retrieving the Mac address of the Docker Container.
Finally, To check all port bindings of a container, run the below docker inspect
command. You’ll see the format
parameter argument below uses the range
attribute to find the container’s port bindings by checking in NetworkSettings
→HostPort
.
One should know about the port bindings because if any port is already used, it shouldn’t be used again; otherwise, it will throw an error message stating the port is already allocated.
docker inspect --format='{{range $p, $conf := .NetworkSettings.Ports}} {{$p}} -> {{(index $conf 0).HostPort}} {{end}}' 8f34d039fa3a
Checking the Port Binding of the container.
Getting a detailed view of Docker Volume Using Docker Inspect
Up to now, you have learned how to find detailed information about the images, containers, and networking, but you haven’t learned about storage. Let’s change that.
To ensure the tutorial has at least one mounted volume attached to a container, let’s first create a container and mount a storage volume.
If you already have a storage volume mounted to a container, you can skip this part.
The command below creates a new Docker container called my_container
, exposes port 80 to the host (-p 80:80
), mounts a volume based on the host’s /var/container_dir directory called mounted_val (-v mounted_vol:/var/container_dir
) using the nginx
image.
docker run --name my_container -p 80:80 -v mounted_vol:/var/container_dir nginx
Now that you have a volume mounted to a container provide the volume’s name to docker volume inspect
. Notice below that the command returns JSON output, only providing information about the mounted storage volume.
docker volume inspect mounted_vol
Inspecting the docker volume
Conclusion
You should now be able to use the docker inspect
command in many different situations, from querying information about images, containers, networking, and storage.
How do you plan to use docker inspect
to query information about your own Docker environment?