6.9 KiB
Executable File
Based on this article
Download HTTPD docker image
Download last httpd image from Docker Hub
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
<VirtualHost *:80>
ServerName gitlab.databasepro.eu
ServerAdmin admin@gitlab.databasepro.eu
DocumentRoot /usr/local/apache2/wwwroot/gitlab
<Directory "/usr/local/apache2/wwwroot/gitlab">
Order allow,deny
AllowOverride All
Allow from all
Require all granted
</Directory>
ErrorLog logs/gitlab-error.log
CustomLog logs/gitlab-access.log combined
</VirtualHost>
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
80port to local8080port - mapping container
443port to local8443port - mounting container
/usr/local/apache2/conf/vhoststo local/app/appsdocker/httpd/vhosts - mounting container
/usr/local/apache2/wwwrootto local/app/appsdocker/httpd/wwwroot - mounting container
/usr/local/apache2/logsto 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
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 <container_id/container_name>
-- start a container
docker start <container_id/container_name>
-- restart a container
docker restart <container_id/container_name>
-- remove a container
docker rm <container_id/container_name>
-- logs for a container
docker logs <container_id/container_name>
-- list images
docker images
-- to delete an image
docker rmi <image_id/image_name>
Update VirtualHost configuration file /app/appsdocker/httpd/vhosts/gitlab.conf for the site gitlab.databasepro.eu
<VirtualHost *:80>
ServerName gitlab.databasepro.eu
ServerAdmin admin@gitlab.databasepro.eu
DocumentRoot /usr/local/apache2/wwwroot/gitlab
<Directory "/usr/local/apache2/wwwroot/gitlab">
Order allow,deny
AllowOverride All
Allow from all
Require all granted
</Directory>
ErrorLog logs/gitlab-error.log
CustomLog logs/gitlab-access.log combined
</VirtualHost>
<VirtualHost *:443>
ServerName gitlab.databasepro.eu
ServerAdmin admin@gitlab.databasepro.eu
DocumentRoot /usr/local/apache2/wwwroot/gitlab
<Directory "/usr/local/apache2/wwwroot/gitlab">
Order allow,deny
AllowOverride All
Allow from all
Require all granted
</Directory>
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"
</VirtualHost>
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