Based on [this article](https://www.middlewareinventory.com/blog/docker-reverse-proxy-example/) Download HTTPD docker image --------------------------- Download last httpd image from [Docker Hub](https://hub.docker.com) ``` docker pull httpd ``` To list installed images ``` docker images ``` Costomize image --------------- Create the directory structure for Apache HTTPD docker application ``` mkdir -p /app/appsdocker/httpd cd /app/appsdocker/httpd mkdir vhosts wwwroot logs ``` In order to browse the image and get the `httpd.conf` file, create an auto-remove container in interactive mode and map local `/app/appsdocker/httpd/` diredctory to container `/usr/local/apache2/htdocs/` directory ``` docker run -it --rm -v /app/appsdocker/httpd/:/usr/local/apache2/htdocs/ httpd:latest bash ``` In interactiv shell, copy `httpd.conf` file to `/usr/local/apache2/htdocs` -- this one is pointing to local `/app/appsdocker/httpd/tmp` ``` root@937797441b4b:/usr/local/apache2# cp /usr/local/apache2/conf/httpd.conf /usr/local/apache2/htdocs/ ``` Update `httpd.conf` ``` Listen 80 Listen 443 IncludeOptional conf/vhosts/*.conf LoadModule ssl_module modules/mod_ssl.so LoadModule proxy_module modules/mod_proxy.so LoadModule xml2enc_module modules/mod_xml2enc.so LoadModule slotmem_shm_module modules/mod_slotmem_shm.so LoadModule proxy_html_module modules/mod_proxy_html.so LoadModule proxy_http_module modules/mod_proxy_http.so LoadModule proxy_balancer_module modules/mod_proxy_balancer.so ``` Create `Dockerfile` under `/app/appsdocker/httpd` ``` # The Base Image used to create this Image FROM httpd:latest # Just my name who wrote this file MAINTAINER Valeriu PLESNILA # to Copy a file named httpd.conf from present working directory to the /usr/local/apache2/conf inside the container # I have taken the Standard httpd.conf file and enabled the necassary modules and adding Support for an additional Directory COPY httpd.conf /usr/local/apache2/conf/httpd.conf # This is the Additional Directory where we are going to keep our Virtualhost configuraiton files # You can use the image to create N number of different virtual hosts RUN mkdir -p /usr/local/apache2/conf/vhosts/ RUN mkdir -p /usr/local/apache2/wwwroot/ # To tell docker to expose this port EXPOSE 80 EXPOSE 443 # The Base command, This command should be used to start the container # Remember, A Container is a Process.As long as the base process (started by base cmd) is live the Container will be ALIVE. CMD ["httpd", "-D", "FOREGROUND"] ``` A simple site -------------- Create a simple VirtualHost configuration file `/app/appsdocker/httpd/vhosts/gitlab.conf` for the site `gitlab.databasepro.eu` ``` ServerName gitlab.databasepro.eu ServerAdmin admin@gitlab.databasepro.eu DocumentRoot /usr/local/apache2/wwwroot/gitlab Order allow,deny AllowOverride All Allow from all Require all granted ErrorLog logs/gitlab-error.log CustomLog logs/gitlab-access.log combined ``` Create a default homepage ``` mkdir /app/appsdocker/httpd/wwwroot/gitlab echo "Hello, you are on gitlab.databasepro.eu" > /app/appsdocker/httpd/wwwroot/gitlab/index.html ``` Build the image ``` cd /app/appsdocker/httpd docker build -t my_httpd_image . ``` Create and run the container: * mapping container `80` port to local `8080` port * mapping container `443` port to local `8443` port * mounting container `/usr/local/apache2/conf/vhosts` to local `/app/appsdocker/httpd/vhosts` * mounting container `/usr/local/apache2/wwwroot` to local `/app/appsdocker/httpd/wwwroot` * mounting container `/usr/local/apache2/logs` to local `/app/appsdocker/httpd/vhosts` ``` docker container run \ --publish 8080:80 \ --publish 8443:443 \ -d --name my_httpd_server \ -v /app/appsdocker/httpd/vhosts:/usr/local/apache2/conf/vhosts \ -v /app/appsdocker/httpd/wwwroot:/usr/local/apache2/wwwroot \ -v /app/appsdocker/httpd/logs:/usr/local/apache2/logs \ my_httpd_image ``` > In my example I used NAT port mzpping from my Livebox as: * external port 80 mapped to internal myvm:8080 * external port 443 mapped to internal myvm:8443 > Add SSL ------- We will use `certboot` client from [Let's encrypt](https://letsencrypt.org) ``` dnf install -y certbot.noarch certbot certonly --webroot --webroot-path /app/appsdocker/httpd/wwwroot/gitlab -d gitlab.databasepro.eu ``` Certificate and chain will be saved in `/etc/letsencrypt/` Destroy container and builded image in order to recreate them for SSL. ``` -- list all container docker ps -a -- stop a container docker stop -- start a container docker start -- restart a container docker restart -- remove a container docker rm -- logs for a container docker logs -- list images docker images -- to delete an image docker rmi ``` Update VirtualHost configuration file `/app/appsdocker/httpd/vhosts/gitlab.conf` for the site `gitlab.databasepro.eu` ``` ServerName gitlab.databasepro.eu ServerAdmin admin@gitlab.databasepro.eu DocumentRoot /usr/local/apache2/wwwroot/gitlab Order allow,deny AllowOverride All Allow from all Require all granted ErrorLog logs/gitlab-error.log CustomLog logs/gitlab-access.log combined ServerName gitlab.databasepro.eu ServerAdmin admin@gitlab.databasepro.eu DocumentRoot /usr/local/apache2/wwwroot/gitlab Order allow,deny AllowOverride All Allow from all Require all granted SSLEngine On ErrorLog logs/gitlab-error.log CustomLog logs/gitlab-access.log combined SSLCertificateFile "/etc/letsencrypt/live/gitlab.databasepro.eu/fullchain.pem" SSLCertificateKeyFile "/etc/letsencrypt/live/gitlab.databasepro.eu/privkey.pem" ``` Recreate a container mapping also `/etc/letsencrypt` ``` docker container run \ --publish 8080:80 \ --publish 8443:443 \ -d --name my_httpd_server \ -v /etc/letsencrypt:/etc/letsencrypt \ -v /app/appsdocker/httpd/vhosts:/usr/local/apache2/conf/vhosts \ -v /app/appsdocker/httpd/wwwroot:/usr/local/apache2/wwwroot \ -v /app/appsdocker/httpd/logs:/usr/local/apache2/logs \ my_httpd_image ``` Optionally using docker-compose ------------------------------- `docker-compose.yaml` file: ``` my_httpd_server: image: my_httpd_image restart: always ports: - 8080:80 - 8443:443 volumes: - /etc/letsencrypt:/etc/letsencrypt - /app/appsdocker/httpd/vhosts:/usr/local/apache2/conf/vhosts - /app/appsdocker/httpd/wwwroot:/usr/local/apache2/wwwroot - /app/appsdocker/httpd/logs:/usr/local/apache2/logs ```