https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_b964594d3d957944241961017b9eb19bf02834de44cce93d8e67dd306852dbe346167181e455e33d5268ea01d973d77bb056848546f31794f31a4c31a9da5aa3.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_23f1ae74c634d7e5e0a067c22b7a8c2d79c3ffd9a3b9395fc82c1b3b99635552b994f1f72f532f28ceaff1ea054ea026cd488cd62fa03a4ad91d212b5f3c5a72.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_451c3884f51125f7687e5bb07cfab033c04cb7174c33f93213b2af4bad2af13cf48b92a7fa95fc86d7d436f355938a3ac50aa119cdb7c9b6d5a52815c3e6033e.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_bfff9e63e857e9ee612e292d4a6edf3ced64d6a756925c953a9d8f77845ff601eca64d73dfa48756b1a9f4a4d6de6127a273bcde16ddeb71a22383460f4e94b0.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_f4dd7e1d73ae5eda35ed5ad6aa965b612dbf483ece3ca50c1e8e30ad8dff1c66a160ed75e958e2db399661d229874783e0834ad813a479437035666b8e9e3386.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_4fce0769137d4cd096989b0349bc3c2bbfca79ac311fdf714c41ab24d87551c7b49b756c8a8de090b0714a0ad0560e49fa532ba5a88875ea4afd78efac464df6.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_85cec8b07d60426b11040e471babca0d2f9c8dc87a9b56e06cad39828f7f67179e29609100f282a574872c9a93fb635b25416300eb4c97bc5a653d00cf6f8dbf.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_6768e5a27d4d357347338621c0d20bd269b126d30eec796193390f2f530fbaea60af84130c46f9786114be65149e661e87d55c339219c90aa76396d7e5b734ef.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_2acd6bdff3b680341e8c727da5169a647123eb8fd0a90253161b4c3af272c15d293bf9bb217008bb13f84d1910b0e166798001f8603b6c026d5c20a76c41d47c.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_093ec665a5e87bd9eafefff9dc4e23de3923181df16d7c63df96b002595c21751d50c7773a5149e4a3d736707a430907fa6ec702d3d8cadc274c4674c877d31f.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_268c9bba6ba649318f0da28c37b09a9bbfa371210f9b6b52faa7fd8ae94abf6b3c3bfeb5df5705c93495ce1152ca58aeabc435d6c6c1bd959025165c3f50e086.js
  • Skip to main content
  • Skip to primary sidebar
  • Skip to footer
  • Home
  • Featured
    • Advanced Python Topics
    • AWS Learning Roadmap
    • JWT Complete Guide
    • Git CheatSheet
  • Explore
    • Programming
    • Development
      • microservices
      • Front End
    • Database
    • DevOps
    • Productivity
    • Tutorial Series
      • C# LinQ Tutorials
      • PHP Tutorials
  • Dev Tools
    • JSON Formatter
    • Diff Checker
    • JWT Decoder
    • JWT Generator
    • Base64 Converter
    • Data Format Converter
    • QR Code Generator
    • Javascript Minifier
    • CSS Minifier
    • Text Analyzer
  • About
  • Contact
CodeSamplez.com

CodeSamplez.com

Programming And Development Resources

You are here: Home / DevOps / NGINX With Docker: Beginner’s Guide To Dockerize NGINX Server

NGINX With Docker: Beginner’s Guide To Dockerize NGINX Server

Updated June 3, 2025 by Rana Ahsan Leave a Comment ⏰ 7 minutes

Beginner's Guide To NGINX With Docker

If you’re reading this, you’re probably diving into the world of NGINX and Docker for the first time. Maybe you’re a developer, a DevOps newbie, or just someone curious about how to make your web server setup easier. Trust me, I’ve been there. The first time I tried to set up NGINX with Docker, I felt like I was trying to solve a Rubik’s Cube blindfolded.

But don’t worry—I’ve got your back. By the end of this guide, you’ll have a working NGINX setup inside Docker, and you’ll understand why this combo is such a game-changer.

NGINX And Docker

What is NGINX?

NGINX is a powerful web server and reverse proxy. It’s like the Swiss Army knife of web servers—it can handle static content, load balancing, SSL termination, and more.

What is Docker?

Docker, on the other hand, is a containerization platform that lets you package applications and their dependencies into lightweight, portable containers. Think of it as a lunchbox for your software—everything you need is neatly packed and ready to go.

Now, When you combine NGINX with Docker, you get a setup that’s easy to deploy, scalable, and consistent across different environments. No more “it works on my machine” excuses!

Why Use NGINX With Docker?

Docker simplifies NGINX deployment, scaling, and management across environments.

I remember the first time I tried to install NGINX directly on my server. It worked, but then I had to deal with dependency issues, conflicting versions, and the dreaded “port is already in use” error. Docker solves all of that.

Here’s why Dockerizing your NGINX server is a great idea:

  • Scalability: Need more NGINX instances? Just fire up more containers.
  • Consistency: Your NGINX setup will work the same way on your laptop, your colleague’s machine, and your production server.
  • Isolation: No more worrying about conflicting software versions. Docker containers are self-contained.
  • Ease of Deployment: Spin up a new NGINX instance in seconds.
An example architecture showing docker based container orchestration with NGINX as reverse proxy

How to setup NGINX with Docker?

Before we dive in, make sure you have:

  • Basic command line knowledge
  • A text editor you’re comfortable with
  • About 30 minutes of free time

Step 1: Install Docker

If you don’t have Docker installed, head over to the official Docker website and follow the installation instructions for your operating system. Once installed, verify it’s working by running:

docker --version

You should see something like Docker version 20.10.17.

Step 2: Pull the NGINX Docker Image

Docker makes it easy to use pre-built images. To pull the official NGINX image, run:

docker pull nginx

This downloads the latest NginX image from Docker Hub.

Step 3: Run NGINX in a Docker Container

Now, let’s start an NginX container:

docker run --name my-nginx -d -p 80:80 nginxCode language: CSS (css)

Here’s what this command does:

  • --name my-nginx: Names the container “my-nginx.”
  • -d: Runs the container in detached mode (in the background).
  • -p 80:80: Maps port 80 on your host machine to port 80 in the container.

Open your browser and navigate to http://localhost. You should see the default NGINX welcome page. Congrats, you’ve just run NGINX in Docker!

Step 4: Customize NGINX Configuration

The default NginX setup is great, but you’ll probably want to customize it. Let’s create a custom configuration file.

  1. Create a directory for your NginX config:
mkdir -p ~/my-nginx-config
  1. Create a file named default.conf inside this directory:
nano ~/my-nginx-config/default.confCode language: JavaScript (javascript)

Add the following basic configuration:

server {
    listen 80;
    server_name localhost;

    location / {
        root /usr/nginx/html;
        index index.html;
    }
}
  1. Run the NginX container with your custom config:
docker run --name my-nginx -d -p 80:80 -v ~/my-nginx-config:/etc/nginx/conf.d nginxCode language: JavaScript (javascript)

The -v flag mounts your local config directory into the container.

Step 5 (Optional): Dockerize NGINX with docker compose

While compose is not mandatory for this simple tutorial use case, it still can make your life easier by not having to deal with lengthy command-line arguments, etc. For multi-container use cases, it’s a must, though.

Let’s create a basic docker-compose.yml file. This is where I made my first mistake years ago – trying to configure everything directly in the container instead of using volume mounts!

version: '3'
services:
  nginx:
    image: nginx:latest
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./my-nginx-config:/etc/nginx/conf.d
      - /usr/nginx/html:/var/www/htmlCode language: JavaScript (javascript)

Now run the command as follows:

docker compose up

Setup SSL/TLS For Dockerized NGINX

Securing your site with HTTPS is a must. Let’s Encrypt provides free SSL certificates, and NGINX makes it easy to integrate them. While setting up SSL for NGINX, especially with Docker might sound a bit daunting at first, its not too hard.

Note: You should always set up the SSL certbot on the host machine instead of the container, as containers are not permanent. Use the docker volume mount to hook them up nicely afterward.

  1. Install Certbot (Let’s Encrypt client):
sudo apt-get install certbotCode language: JavaScript (javascript)
  1. Obtain an SSL certificate:
sudo certbot certonly --standalone -d yourdomain.comCode language: CSS (css)
  1. Update your NginX config to use the SSL certificate:
server {
    listen 443 ssl;
    server_name yourdomain.com;

    ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;

    location / {
        root /usr/share/nginx/html;
        index index.html;
    }
}

3. NGINX Configuration

Create a file nginx/conf.d/default.conf:

server {
    listen 80;
    server_name yourdomain.com;
    
    location /.well-known/acme-challenge/ {
        root /var/www/certbot;
    }

    location / {
        return 301 https://$host$request_uri;
    }
}

server {
    listen 443 ssl;
    server_name yourdomain.com;
    
    ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;
    
    # Improved SSL configuration
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;
    
    location / {
        root /var/www/html;
        index index.html;
    }
}Code language: PHP (php)

And lastly, make sure the docker-compose file also properly has the volume mount setup for the SSL certificates from the host os to the docker OS.

services:
  nginx:
    image: nginx:latest
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./my-nginx-config:/etc/nginx/conf.d
      - /etc/letsencrypt/live/yourdomain.com:/etc/letsencrypt/live/yourdomain.com 
      - /usr/nginx/html:/var/www/htmlCode language: JavaScript (javascript)

Common Issues

Permission Issues: Docker containers run as root by default, but files created by Certbot might have different permissions. Fix this with:

chmod -R 755 ./certbot

Certificate Renewal: Don’t forget to set up auto-renewal! Add this to your crontab:

0 12 * * * docker-compose run certbot renew && docker-compose restart nginx

Pro Tips

  • Always Use Volume Mounts: This makes it easy to update configurations without rebuilding containers. And as mentioned above, is a must if you are doing SSL configuration.
  • Test Locally First: Use self-signed certificates for local development. (example with openssl)
  • Monitor Your Logs: NGINX logs can be gold when debugging issues:
docker-compose logs -f nginx

Real-world Use Cases

A NGINX server within Dockerized environment is perfect for:

  • Hosting static websites: Serve HTML, CSS, and JavaScript files effortlessly.
  • Reverse proxying: Route traffic to multiple backend services.
  • Load balancing: Distribute traffic across multiple servers.
  • SSL: Secure your site with HTTPS for free using Let’sEncrypt.

I’ve used this setup for everything from personal blogs to production-grade microservices. It’s versatile, reliable, and—once you get the hang of it—super easy to manage.

Limitations and Things to Watch Out For

  • Docker containers add a small overhead compared to bare metal installations
  • SSL certificate renewal needs to be properly scheduled(as shown above)
  • Container updates need to be managed carefully

Final Thoughts

Setting up NGINX with Docker might seem scary at first, but trust me – once you get the hang of it, you’ll never want to go back to traditional setups. I still remember the satisfaction of getting my first containerized NGINX server running with valid SSL certificates. It’s like building with LEGO blocks – once you understand how the pieces fit together, the possibilities are endless!

Remember, everyone starts somewhere. Don’t get discouraged if things don’t work perfectly the first time. Keep experimenting, and feel free to reach out to the community – we’ve all been there!

Happy containerizing! 🐳


Share if liked!

  • Click to share on Facebook (Opens in new window) Facebook
  • Click to share on X (Opens in new window) X
  • Click to share on LinkedIn (Opens in new window) LinkedIn
  • Click to share on Pinterest (Opens in new window) Pinterest
  • Click to share on Reddit (Opens in new window) Reddit
  • Click to share on Tumblr (Opens in new window) Tumblr
  • Click to share on Pocket (Opens in new window) Pocket

You may also like


Discover more from CodeSamplez.com

Subscribe to get the latest posts sent to your email.

First Published On: January 22, 2025 Filed Under: DevOps Tagged With: docker, nginx

About Rana Ahsan

Rana Ahsan is a seasoned software engineer and technology leader specialized in distributed systems and software architecture. With a Master’s in Software Engineering from Concordia University, his experience spans leading scalable architecture at Coursera and TopHat, contributing to open-source projects. This blog, CodeSamplez.com, showcases his passion for sharing practical insights on programming and distributed systems concepts and help educate others.
Github | X | LinkedIn

Reader Interactions

Leave a ReplyCancel reply

Primary Sidebar

  • Facebook
  • X
  • Pinterest
  • Tumblr

Subscribe via Email

Top Picks

python local environment setup

Python Local Development Environment: Complete Setup Guide

In-Depth JWT Tutorial Guide For Beginners

JSON Web Tokens (JWT): A Complete In-Depth Beginners Tutorial

The Ultimate Git Commands CheatSheet

Git Commands Cheatsheet: The Ultimate Git Reference

web development architecture case studies

Web Development Architecture Case Studies: Lessons From Titans

static website deployment s3 cloudfront

Host Static Website With AWS S3 And CloudFront – Step By Step

Featured Dev Tools

  • JWT Decoder
  • Diff Checker

Recently Published

advanced service worker features

Advanced Service Worker Features: Push Beyond the Basics

service worker framework integration

Service Workers in React: Framework Integration Guide

service worker caching strategies

Service Worker Caching Strategies: Performance & Offline Apps

service worker lifecycle

Service Worker Lifecycle: Complete Guide for FE Developers

what is service worker

What Is a Service Worker? A Beginner’s Guide

Footer

Subscribe via Email

Follow Us

  • Facebook
  • X
  • Pinterest
  • Tumblr

Explore By Topics

Python | AWS | PHP | C# | Javascript

Copyright © 2025

https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_747dffed228c384f8c5c6c908bbda6d5c3ff0b18bf31983d19b1f97dac89da81d9b7e209eb6f548872e377a328e70e0c51b57be7841db3eb516f6fe9d01d784a.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_c402e38f1879c18090377fb6b73b15ac158be453ecda3a54456494fe8aba42b990c293bae5424e5643d52515ffc2067e0819995be8d07d5bba9107a96780775c.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_ffc3511227531cc335353c54c3cbbaa11d0b80e5cb117478e144436c13cd05495b67af2e8950480ed54dbdabcdcef497c90fdb9814e88fe5978e1d56ce09f2cf.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_d57da9abfef16337e5bc44c4fc6488de258896ce8a4d42e1b53467f701a60ad499eb48d8ae790779e6b4b29bd016713138cd7ba352bce5724e2d3fe05d638b27.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_edc0e9ef106cc9ef7edd8033c5c6fcff6dc09ee901fd07f4b90a16d9345b35a06534f639e018a64baaf9384eee1df305570c1ecad747f41b787b89f53839962b.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_5a3aa28cd4eb24db3e3e2acd58230ff5cdc78120b94c2b118227d4c7806ecac03978e1a10404240314f66a3b82af8823768abb8b9eccc5003d198eb077ea12b8.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_dccc492dbbfdac33d1411f9df909e849c7268fcf99b43007f278cde3a0adc0ae00e8cae5ec81cf255b9a6eae74e239ba1fa935572af77173219cb081f7d2327d.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_00bacf9e36181aac2b666d110cd9d82257f846766e7041b2d7b3c909b458982931ccc9b203e37098fbdfcf43ca359cf04e3824a724a6789fc204196d3a72ad29.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_259645f7837b2e3bbea4da322a28e9d966b3e0be06f6f147e120ed7acb1b3657b8d3cb198e86902299b01216de148c1f7c8f3cedf825d705ee5b9b749ddcff01.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_aa5a5d229b421633f4247380e1e8c0a4854f82efb35d13a5b07b7b8fbe22e98842a580f063e5965345a51c477a7f5c2585edf8dd7d896b2438dc61f91d8d970c.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_bb8058a9e234a7ffaa98891b1df7f6b8e67410e6984568b151daa05113b8c7f89d7b5918ae73f020998a16f7f5a087a13d6a9a5e5d7c301e2ca12fd9d1f8d177.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_647fb67570c6108fb10ae6785a1abdbecac99ffcf80351d0bef17c3cf783dce497b1895fcdaae997dacc72c359fbfb128cc1540dd7df56deb4961e1cd4b22636.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_f7a298a0f1f754623fe3b30f6910ce2c1373f715450750bd7a391571812b00df1917e2be90df6c4efc54dbdfda8616278a574dea02ba2c7a31992768df8db334.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_df30604d5842ef29888c3c1881220dc6d3f8854666d94f0680c5f38aa643c5fb79b10eb9f10998d8856eb24ca265783195937434fd6c2bb8e4846df0277a7fb7.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_f17fe6fb0993f1703181d7ae9e9ea570f3d33a43afd6f2a4567daa1a6745698c7b8193dc72d50991d2dd87cd3dcf663959206607d193a9b57926d061a1f50aef.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_945dcbab2c2a131f3c90f4fb91776b76066d589f84fb55bff25cd5d79a56218000616bfca1f0af9a74f32348693707af49e8fe624de8aa34f1e1c5b6a25709cf.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_65820d252e1b93596de6697fd5f02483f3e2524a0696c7d698b64745edb32bf5831a90e556842f5f88c8209766cc78ca3a41cf783d20236a9f90d4a7ea7b3e72.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_7286884797a1210857e2a36f8ab46604b0034b6abf512380447a5763c873db6a72b8547f660053de0ea69faef1eb64878f39ff4b0ea86c963efab95764a3bf5b.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_cbcf6c279ac6c6a25ae138bf964e64a5fd90d22dcdf8a53b6fe7b72cefa51063bfb0181a6e50dd2acdcae2795619887d1d83b10461e44e5103be756f2588d837.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_47965bc586b95810c925b9df3314e0c9a5cd121e70ca0831f87df0bc034695de4f83ecf2def86f737e14614ee138794473cf32cd3082a5d38db9dec0c1f266fa.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_12aa201cea075846d266536aa222d64d4088b851d87f55dac5e611b77add6826c8ebc6e82650fcd1a9e88a05a0072dedd195719c5f64cd4580a0acd8aee05d92.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_7859317dea28a85c983d7b2a933704b193600b52929d2d894deae21a5d78f1f9715214d4c2ed1b925e9183146806725621d586779705dea3b651260eb53a2f8a.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_f30fa0b081862ee5bb81d9e44193cebd25a35a383ecada840ba971c121024b95491eff5de2719ba00397bca23d1046d660cc56c055719305f52aa88757c48aac.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_d87ea86dd0e7ecdd5fe7a5bb67becf943e57c3add866b456034d51663d099031bd563e12f61fdccc044969adf938a8584ed22ccd401ab8b669e20e4f92fb54e8.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_35311c3d71a3605fad4e1d6b50f3911311cdcc46418bdf56d6d0308a75a69585269ee7582a335e29989adf308fa1a81a10a2c2d4e257e9d680447a4996f6269e.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_f4fc182ef03c12e9dcadd6febc3dbaa4a29134469057ca9e8ec0be2f2de29a494514ff4b59798e74debf26f78b2df2b3e2665c69b77035761fb463b783202915.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_85c0f2769456e60153b0fd8364b82a035da53384f62de342d9bdca806f3f1ea56486919a00497a18d457949c82bf8bfacc4423fc332074ddf71a49a8fe628fff.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_67f99bef3678c549a14b5f2ff790cce6aba338dca29020755444231b45fa0f980f795e3658496ba70739a099b47b22bc2eab564343ac6132309de3adbbae3455.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_09eecfdd96206ed13830b4b93cfb2cc75cd38083671a34194437b5734b5bb38712209dc335b07e3266ceb3c3a44a155b9bbe5f3e0e1105b19dd45d3def76f020.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_4c089fbdb88e3b624a6f884d3ba1bf606f003bfcd3742376d0d353cd62181dc663aa3811a56361c3100de488fc4d6595a50de2b26f058921ba74f5f2c1b5be00.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_897ff6ac314c5f5e0f496c6af624bd9abf296a02cb5aeb850b9220b6dc3ce2fc4004cb02ed8b59d59d4b9c9d90f050d6eebc1d08ecaebab2f671f7d9367e6410.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_67d1e619e71d36ae00ddcf85ee18628bb4eb64fcb3d6119b463e75cb987013420a21136d19cd03e6634ccc01cfa9af4a357930e4cf6900953b7812efb4f249fb.js