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
.
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:
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;
}
}
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>
Video Demo
Here’s a quick video demo on how to do the above:
Conclusion
Now you have 2 different containers on the same Droplet being served from different domain names! Of course, this is just a very basic example, you could go a lot further by expanding your Nginx config a lot more, for example adding more headers to your Nginx proxy pass and even installing a Let’s Encrypt SSL.
Hope that this helps! Let me know if you have any questions!
Regards,
Bobby