How to Host Multiple Docker Containers on a Single Droplet with Nginx Reverse Proxy?

 

Step 1 - run your Docker containers

For the same of simplicity, I will run a simple and I’ll run 2 small httpd containers.

  • Run your first container and map port 8080 on your host:
docker run -dit --name container-1 -p 8080:80 httpd:2.4

Now if you visit http://your-dropets-ip:8080, you should be able to see a message saying It Works!.

Just so that we could differentiate the two containers, let’s update the It works! message with Container 1 for example:

  • First get your container ID
docker ps

Then run the following sed command to update the message:

docker exec CONTAINER_ID sed -i 's/It works!/Container 1/' /usr/local/apache2/htdocs/index.html

This would basically run a search and replace for the It works! string and update it with Container 1 in the default index.html file in the container itself.

If you visit your Droplet’s IP again in your browser the message should change from It works! to Container 1.

Let’s do the same thing for container 2, but map it to port 8081 instead:

docker run -dit --name container-2 -p 8081:80 httpd:2.4

Then agian get your container ID

docker ps

Then run the sed command again to update the It works! message to Container 2:

docker exec CONTAINER_ID sed -i 's/It works!/Container 2/' /usr/local/apache2/htdocs/index.html

Now if you visit http://your-dropets-ip:8081, you should be able to see a message saying Container 2.

Step 2 - Configure Nginx

Now that we have our containers up and running we can go ahead and configure our Nginx server blocks, I will go ahead and use the following two subdomain names for this example:

  • container1.bobbyiliev.com
  • container2.bobbyiliev.com

To keep things as simple as possible, I will create 2 server blocks with the following content:

  • Server block #1:

Create a new file called container1.bobbyiliev.com.conf in the /etc/nginx/sites-available/ directory and add the following content:

server {
  listen        80;
  server_name   container1.bobbyiliev.com;

  location / {
    proxy_pass  http://localhost:8080;
  }
}
  • Server block #2:

Create a new file called container2.bobbyiliev.com.conf in the /etc/nginx/sites-available/ directory and add the following content:

server {
  listen        80;
  server_name   container2.bobbyiliev.com;

  location / {
    proxy_pass  http://localhost:8081;
  }
}

Then once you have the two config files ready cd to the /etc/nginx/sites-enabled directory, and run the following commands:

ln -s ../sites-available/container1.bobbyiliev.com.conf .

ln -s ../sites-available/container2.bobbyiliev.com.conf .

Run a config test to make sure that there are no errors:

nginx -t

And if you get Syntax OK message, restart Nginx:

systemctl restart nginx

Note, for more information about Nginx server blocks, I would recommend taking a look at this tutorial here:

https://www.digitalocean.com/community/tutorials/how-to-set-up-nginx-server-blocks-virtual-hosts-on-ubuntu-16-04

Step 3 - Test the setup

That is pretty much it, now if I visit container1.bobbyiliev.com I should be able to see the Container 1 message and the same for container2.bobbyiliev.com.

To test that I could run a simple curl request:

  • curl container1.bobbyiliev.com
 
 

You should see the following output

<h1>Container 1</h1>

Then run the same request for container2.bobbyiliev.com:

  • curl container2.bobbyiliev.com
 
 

And agian you should see the following output

<h1>Container 2</h1>

Comments

Popular posts from this blog

simple inventory management system using Google Apps Script

sales forecasting ML model in retail using the Prophet algorithm from the Facebook Prophet library