Setting up multiple hosts with nginx
Prerequisites
Before you start, make sure to have Docker and Nginx installed, here’s how to do that:
To install Docker follow the steps here:
https://www.digitalocean.com/community/questions/how-to-install-and-run-docker-on-digitalocean-dorplet
To install Nginx follow the steps here:
https://www.digitalocean.com/community/tutorials/how-to-install-nginx-on-ubuntu-18-04
Once you have both installed, you can continue with the steps:
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>