Hi all!
Recently I had to setup a few small Docker containers for a couple of small websites.
As the sites were really small I didn’t want to run each one on a separate Droplet, so instead, I used Nginx with separate Nginx server blocks for each site and a reverse proxy for each Docker container.
Here’s how I set that up:
This textbox defaults to using Markdown to format your answer.
You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!
These answers are provided by our Community. If you find them useful, show some love by clicking the heart. If you run into issues leave a comment, or add your own answer to help others.
Prerequisites
Before you start, make sure to have Docker and Nginx installed, here’s how to do that:
https://www.digitalocean.com/community/questions/how-to-install-and-run-docker-on-digitalocean-dorplet
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.8080
on your host: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 withContainer 1
for example:Then run the following
sed
command to update the message:This would basically run a search and replace for the
It works!
string and update it withContainer 1
in the defaultindex.html
file in the container itself.If you visit your Droplet’s IP again in your browser the message should change from
It works!
toContainer 1
.Let’s do the same thing for container 2, but map it to port
8081
instead:Then agian get your container ID
Then run the
sed
command again to update theIt works!
message toContainer 2
: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:
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:Create a new file called
container2.bobbyiliev.com.conf
in the/etc/nginx/sites-available/
directory and add the following content:Then once you have the two config files ready
cd
to the/etc/nginx/sites-enabled
directory, and run the following commands:Run a config test to make sure that there are no errors:
And if you get
Syntax OK
message, 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:You should see the following output
Then run the same request for container2.bobbyiliev.com:
And agian you should see the following output
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
Hi Bobby,
Thank’s a lot for your tutorial i was really struggling with this for many days.
I follow all your step and i add let’s encrypt certificate.
Everything is fine (certificate, …), i can access from https://mydomain.com my index.html (page load normally) except that i cannot access all my other static files and folders fom my docker container (js, nodemodule, css, …). i get a ERR_ABORTED 404 for those files and folders. Those static files are accessible from my proxy_pass url in browser (http://myIp:myport).
Is this a common problem? I’m new at this so maybe i don’t see something really obvious.
I add my config in any case :
Dockerfile :
After building and pushing to my digital ocean registry i deploy with this cmd to my digital ocean droplet
Below a part of my nginx domain.com.conf.
And here my proxy.conf
Looking forward to your answer if you can help.
L
Hi Bobby, Thank you very much for your tutorial,
What I want to achieve seems quite straightforward but I’ve been battling it for days now
I have a container for my frontend react app pulled in and running, same for my node-typescript app.
I mapped the frontend to port 3000 and the backend to 8000
I then set up Nginx to route the root requests to 3000 and then the request to the IP:8000 to /api
The frontend works fine but for some reason, I can’t seem to get the backend to work the way I want it.
When I visit the http://myIP:8000 it works from postman but when I use my https://server_address/api, the request comes back as bad gateway, tried a couple of solutions online but to no avail yet.
I will look forward to your response