Simple Script To Monitor Your Docker Container

Tejaswini Polaka

2 min read

Looking for an easy way to periodically monitor the status of your Docker containers? Want to feel safe knowing its status via email? Well, I got a solution for you that we recently used for one of our clients.

The idea here is to check the container status at a regular interval and send an email alert based on its state. This requires three steps and they are:

  • Configure Container Name
  • Configure SendGrid keys
  • Run a periodic check using cronjob.

Configure Container Name:

CONTAINER_NAME

You may ask why are we trying to get the container name instead of container id? The answer is, container id will change when we restart the service while the container name will persist.


Here is the shell script to monitor the container :

#!/bin/bash #Description    :if container is down  it will trigger the mail and logs #Author         :tejaswini   
#variables 
#sendgrid api key ,user, password 
SENDGRID_API_KEY="" 
SENDGRID_USER="" 
SENDGRID_PASSWORD="" 
SUBJECT="service down alert for "
#sending mail as 
FROM_EMAIL="" 
#sendig user 
FROM_USER="$user" 
#sending mail to 
EMAIL_TO=""
#container name 
CONTAINER_NAME="" 
servicevalue=$(docker inspect -f {{.State.Running}} "$CONTAINER_NAME") 
if [ "$servicevalue" = true ]; then   
echo "$service is running!!!" 
else   
mailfile=$(echo "Please check your service $service on ${HOSTNAME}" )    
bodyHTML="<p> $mailfile </p>"     
maildata='{"personalizations": [{"to": [{"email": "'${EMAIL_TO}'"}]}],"from": {"email": "'${FROM_EMAIL}'",          "name": "'${FROM_NAME}'"},"subject": "'${SUBJECT}'","content": [{"type": "text/html", "value": "'${bodyHTML}'"}]}'   
curl --request POST \
 --url https://api.sendgrid.com/v3/mail/send \       
 --header 'Authorization: Bearer '$SENDGRID_API_KEY \      
 --header 'Content-Type: application/json' \       
 --data "'$maildata'" 
fi

Configure SendGrid Keys:
In the script above, the below-listed variables or params helps you to configure the SendGrid Keys

SENDGRID_API_KEY
SENDGRID_USER
SENDGRID_PASSWORD
FROM_EMAIL
EMAIL_TO

Run a periodic check using cronjob.
Open the crontab editor using crontab -e and append the following line to it.

10 * * * * /bin/bash  path/containermoniter.sh

That’s it. You got the script that can monitor your container services.

Wait! Wait! Wait! Don’t go. I have something more for you. As you know, when we deploy the application in Swarm mode, the container name will change and so we need a nice way to change the variable value “CONTAINER_NAME”.

You can easily do it by overriding the following configuration in the script. They are:

  • Stack name
  • Service name
  • Change the if condition

Here is the updated script for you:

#!/bin/bash #Description    :if container is down  it will trigger the mail and logs 
#variables 
#sendgrid api key ,user, password 
SENDGRID_API_KEY="" 
SENDGRID_USER="" 
SENDGRID_PASSWORD="" 
SUBJECT="service down  Alert of "
#sending mail as 
FROM_EMAIL="" 
#sendig user 
FROM_USER="$user" 
#sending mail to 
EMAIL_TO=""
#container name 
CONTAINER_NAME="" 
#stack name
stackname=””
#service name 
servicename=""
container=$(docker stack  ps “$stackname” | awk ‘{print $2}’| grep “$servicename” | wc -l)
if [ “$container” -ge 1 ]; then  
echo "$service is running!!!" 
else   
echo ""$service" is not runing"    
mailfile=$(echo "Please check your service $service on ${HOSTNAME}" )    
bodyHTML="<p> $mailfile </p>"     
maildata='{"personalizations": [{"to": [{"email": "'${EMAIL_TO}'"}]}],"from": {"email": "'${FROM_EMAIL}'",          "name": "'${FROM_NAME}'"},"subject": "'${SUBJECT}'","content": [{"type": "text/html", "value": "'${bodyHTML}'"}]}'     
curl --request POST \       
--url https://api.sendgrid.com/v3/mail/send \ 
--header 'Authorization: Bearer '$SENDGRID_API_KEY \ 
--header 'Content-Type: application/json' \       
--data "'$maildata'" 
fi

I hope you will find the above script(s) useful. I look forward to hearing your comments and suggestions as this is my first blog at Spritle.

Related posts:

4 Replies to “Simple Script To Monitor Your Docker Container”

  1. HI Tejaswini,
    Thanks for sharing. Good one. All the very best for your bright future.

  2. Hi Tejaswini,
    Thanks, The script works fine for a single container, how to monitor multiple containers with the use of this script?

  3. Hi Tejaswini,
    I have a question.suppose the user is working on a rstudio container.Now I want to write a script in such a way that it will monitor user action whether he is active or inactive.if the user is inactive for a particular time it will terminate the pod on which it is running

  4. Hi ,

    I would really appreciate for your post, but as a Devops engineer I too have the same requirement of monitor docker container using the script but the problem is the containers are hosted in Private IP. Please let me know if you can help me in resolving the issue.

Leave a Reply

Your email address will not be published. Required fields are marked *