How To Debug Running Docker Containers

Debugging Docker containers is an essential skill when working with containerized applications. Let’s explore the different ways to debug Docker containers.



How To Debug Running Docker Containers
Image by Editor | Midjourney & Canva

 

Containers can sometimes behave unexpectedly due to configuration issues, application bugs, or resource constraints. In this tutorial, we'll go over the different methods to debug running containers by taking the example of a Postgres container.

 

Prerequisites

 

To follow along to this tutorial:

  • You should have Docker installed in your development environment. Get Docker if you haven’t already.
  • You should be comfortable with how Docker works and basic commands to pull images, start, stop, and manage containers.

 

Pull and Start a PostgreSQL Container

 

First, let's pull the latest PostgreSQL image from DockerHub and start a container. Here, we pull postgres:16 using the docker pull command:

$ docker pull postgres:16

 

Once the pull is complete, you can start the postgres container with the following docker run command. Note that the POSTGRES_PASSWORD is the required environment variable you need to start the container:

$ docker run --name my_postgres -e POSTGRES_PASSWORD=my_postgres_password -d postgres

 

This command starts a new container named my_postgres with PostgreSQL running inside it. You can verify it by running the docker ps command:

$ docker ps

 

Which outputs:

CONTAINER ID   IMAGE         COMMAND                  CREATED          STATUS         PORTS      NAMES
5cb6fabbbc8b   postgres:16   "docker-entrypoint.s…"   18 seconds ago   Up 9 seconds   5432/tcp   my_postgres

 

 

1. Inspect the Container

 

You can use the docker inspect command to retrieve detailed information about a container. This can be useful for checking the container's configuration, network settings, and state:

$ docker inspect my_postgres

 

This command outputs a JSON object with all the details about the container. You can use tools like jq to parse and extract specific information of interest from this output.

 

docker-inspect
Truncated output of docker inspect my_postgres

 

 

2. View Container Logs

 

The docker logs command fetches the logs from a running container. This is useful for troubleshooting issues related to the application running inside the container.

$ docker logs my_postgres

 

 

docker-logs
Truncated output of docker logs my_postgres

 

3. Execute Commands Inside the Container

 

Sometimes it’s helpful to get into the container and run a bunch of diagnostic commands. You can do this with the docker exec command that allows you to run commands inside a running container. This is useful for inspecting the container's filesystem, checking environment variables, or the like.

Here’s how you can start an interactive shell session inside the running container:

$ docker exec -it my_postgres /bin/bash

 

This command opens an interactive bash shell inside the my_postgres container. So you can run commands from within the container.

 

4. Check Running Processes

 

The docker top command shows the running processes inside a container. This can help you identify if any processes are consuming more resources than expected or if there are any unexpected processes running:

$ docker top my_postgres

 

UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
ollama              8116                8096                0                   09:41               ?                   00:00:00            postgres
ollama              8196                8116                0                   09:41               ?                   00:00:00            postgres: checkpointer
ollama              8197                8116                0                   09:41               ?                   00:00:00            postgres: background writer
ollama              8199                8116                0                   09:41               ?                   00:00:00            postgres: walwriter
ollama              8200                8116                0                   09:41               ?                   00:00:00            postgres: autovacuum launcher
ollama              8201                8116                0                   09:41               ?                   00:00:00            postgres: logical replication launcher

 

 

5. Attach to the Container

 

The docker attach command allows you to attach your terminal to a running container's main process. This can be useful for debugging interactive processes:

$ docker attach my_postgres

 

Note that attaching to a container is different from docker exec as it connects you to the container's main process and streams its standard output and standard error to your terminal.

 

6. View Resource Usage

 

With the docker stats command, you can get real-time statistics on container resource usage including CPU, memory, and network. Which is helpful if you want to analyze performance issues:

$ docker stats my_postgres

 

Here's a sample output:

CONTAINER ID   NAME          CPU %     MEM USAGE / LIMIT     MEM %     NET I/O       BLOCK I/O         PIDS
5cb6fabbbc8b   my_postgres   0.03%     34.63MiB / 3.617GiB   0.94%     10.6kB / 0B   38.4MB / 53.1MB   6



CONTAINER ID   NAME          CPU %     MEM USAGE / LIMIT     MEM %     NET I/O       BLOCK I/O         PIDS
5cb6fabbbc8b   my_postgres   0.03%     34.63MiB / 3.617GiB   0.94%     10.6kB / 0B   38.4MB / 53.1MB   6



CONTAINER ID   NAME          CPU %     MEM USAGE / LIMIT     MEM %     NET I/O       BLOCK I/O         PIDS
5cb6fabbbc8b   my_postgres   0.03%     34.63MiB / 3.617GiB   0.94%     10.6kB / 0B   38.4MB / 53.1MB   6


...

 

Debugging Docker containers involves inspecting container config, viewing logs, executing commands inside the container, and monitoring resource usage. With these techniques, you can effectively troubleshoot and resolve issues with your containerized applications. Happy debugging!

 

Additional Resources

 

Check out the following resources if you’d like to explore further:

 

 

Bala Priya C is a developer and technical writer from India. She likes working at the intersection of math, programming, data science, and content creation. Her areas of interest and expertise include DevOps, data science, and natural language processing. She enjoys reading, writing, coding, and coffee! Currently, she's working on learning and sharing her knowledge with the developer community by authoring tutorials, how-to guides, opinion pieces, and more. Bala also creates engaging resource overviews and coding tutorials.