Let’s install a webserver on Linux that you can use to host your website. We will set up an Nginx-powered containerized web stack with MySQL database and trusted HTTPS certificates via lets-encrypt. And the container image we will use will run out-of-the-box. But you also can fully customize it to host multiple websites, operate as a reverse proxy, and much more.
Prerequisites for your webserver
Before we start to set up our web server you should have a domain ready that points to the public IP address of your webserver. Your web server must be accessible via ports 80 and 443 from the public internet. You should also create an A record for the hostname “www” that points to your web server, as well. The last step is not mandatory, but it’s recommended because we will use the “www” as a subdomain in our web server configuration, later.
For this example, I will use Ubuntu 20.04 LTS as my Linux distribution. But you can choose almost every other Linux distribution that supports docker. You only need to check out the docker installation guide for your distro.
Start installing docker and docker-compose on Linux
First, we need to install docker on our Linux webserver. If you have trouble or want to use another distro/operating system, you can also refer to the official docker documentation: https://docs.docker.com/install/
(Optional) Remove old docker installation
It is recommended, to first uninstall old docker installations. If you already have Docker set up and running correctly or never used it before, you can skip this step.
sudo apt remove docker docker-engine docker.io containerd runc
Install docker repository
sudo apt update sudo apt install apt-transport-https ca-certificates curl gnupg-agent software-properties-common curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" sudo apt update
sudo apt-get install docker-ce docker-ce-cli containerd.io
Check if docker was installed successfully
If everything was successful you can test docker, with this simple command
sudo docker run hello-world
Install docker-compose on Ubuntu 20.04 LTS Linux
Check latest stable release
Docker-compose has no installation package for apt. Therefore, you may check the latest stable release version first on the official website
Download the latest version (in this case it is 1.25.5, this may change whenever you read this tutorial!)
sudo curl -L "https://github.com/docker/compose/releases/download/1.25.5/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
Make directory executable
sudo chmod +x /usr/local/bin/docker-compose
Check if docker-compose is working correctly
If everything was successful you can test docker-compose with this command.
sudo docker-compose --version
Install linuxserver.io SWAG webserver stack
Now, we need to create a docker-compose file to easily manage our web server stack containers. I’m using the docker image and template from https://linuxserver.io. Because these are well-maintained community images.
First, I will create a new folder in the /opt directory called /opt/webserver_swag. Then, I create a docker-compose.yaml file in this directory. You should also change the ownership of this folder to your administrative Linux user. But be aware, you should not use the root user.
sudo mkdir /opt/webserver_swag sudo chown christian:christian /opt/webserver_swag vim /opt/webserver_swag/docker-compose.yaml
In this file you can use the following template, please refer to the official documentation https://docs.linuxserver.io/general/swag
Create a docker-compose.yaml
This is a simple Docker-Compose template for a webserver based on Nginx.
--- version: "2" services: swag: image: linuxserver/swag container_name: swag cap_add: - NET_ADMIN environment: - PUID=1001 - PGID=1001 - TZ=Europe/Berlin - URL=do-test-1.the-digital-life.com - SUBDOMAINS=www - VALIDATION=http volumes: - /opt/webserver_swag/config:/config ports: - 443:443 - 80:80 #optional restart: unless-stopped
To start your webserver just execute the following command, while you’re in the /opt/webserver_swag folder.
docker-compose up -d
Add a database to the webserver
Update your docker-compose.yaml
You can update your existing Docker-Compose template, if you want to add a database to your webserver. Because you often need a MySQL database, for example to deploy a WordPress Blog.
--- version: "2" services: mariadb: image: linuxserver/mariadb container_name: mariadb environment: - PUID=1001 - PGID=1001 - MYSQL_ROOT_PASSWORD=mariadbpassword - TZ=Europe/Berlin - MYSQL_DATABASE=WP_database - MYSQL_USER=WP_dbuser - MYSQL_PASSWORD=WP_dbpassword volumes: - /opt/webserver_swag/config/mariadb:/config restart: unless-stopped swag: image: linuxserver/swag container_name: swag cap_add: - NET_ADMIN environment: - PUID=1001 - PGID=1001 - TZ=Europe/Berlin - URL=do-test-1.the-digital-life.com - SUBDOMAINS= - VALIDATION=http volumes: - /opt/webserver_swag/config:/config ports: - 443:443 - 80:80 #optional depends_on: - mariadb restart: unless-stopped