Docker Install Apache
Method 1: docker pull httpd
Search for the httpd image on Docker Hub:
You can view other versions of httpd by sorting, with the default being the latest version httpd:latest.
Additionally, we can use the docker search httpd
command to view available versions:
tutorialpro@tutorialpro:~/apache$ docker search httpd
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
httpd The Apache HTTP Server .. 524 [OK]
centos/httpd 7 [OK]
rgielen/httpd-image-php5 Docker image for Apache... 1 [OK]
microwebapps/httpd-frontend Httpd frontend allowing... 1 [OK]
lolhens/httpd Apache httpd 2 Server 1 [OK]
publici/httpd httpd:latest 0 [OK]
publicisworldwide/httpd The Apache httpd webser... 0 [OK]
rgielen/httpd-image-simple Docker image for simple... 0 [OK]
solsson/httpd Derivatives of the offi... 0 [OK]
rgielen/httpd-image-drush Apache HTTPD + Drupal S... 0 [OK]
learninglayers/httpd 0 [OK]
sohrabkhan/httpd Docker httpd + php5.6 (... 0 [OK]
aintohvri/docker-httpd Apache HTTPD Docker ext... 0 [OK]
alizarion/httpd httpd on centos with mo... 0 [OK]
...
Here, we pull the official image:
tutorialpro@tutorialpro:~/apache$ docker pull httpd
After the download completes, we can see the httpd image in our local image list:
tutorialpro@tutorialpro:~/apache$ docker images httpd
REPOSITORY TAG IMAGE ID CREATED SIZE
httpd latest da1536b4ef14 23 seconds ago 195.1 MB
Method 2: Build from Dockerfile
Create Dockerfile
First, create a directory named apache
to store the related files:
tutorialpro@tutorialpro:~$ mkdir -p ~/apache/www ~/apache/logs ~/apache/conf
The www
directory will be mapped to the application directory of the apache container.
The logs
directory will be mapped to the log directory of the apache container.
The configuration files in the conf
directory will be mapped to the configuration files of the apache container.
Navigate to the created apache
directory and create a Dockerfile:
FROM debian:jessie
# add our user and group first to make sure their IDs get assigned consistently, regardless of whatever dependencies get added
#RUN groupadd -r www-data && useradd -r --create-home -g www-data www-data
ENV HTTPD_PREFIX /usr/local/apache2
ENV PATH $PATH:$HTTPD_PREFIX/bin
RUN mkdir -p "$HTTPD_PREFIX" \
&& chown www-data:www-data "$HTTPD_PREFIX"
WORKDIR $HTTPD_PREFIX
# install httpd runtime dependencies
# https://httpd.apache.org/docs/2.4/install.html#requirements
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
libapr1 \
libaprutil1 \
libaprutil1-ldap \
libapr1-dev \
libaprutil1-dev \
libpcre++0 \
libssl1.0.0 \
&& rm -r /var/lib/apt/lists/*
ENV HTTPD_VERSION 2.4.20
ENV HTTPD_BZ2_URL https://www.apache.org/dist/httpd/httpd-$HTTPD_VERSION.tar.bz2
RUN buildDeps=' \
ca-certificates \
curl \
bzip2 \
gcc \
libpcre++-dev \
libssl-dev \
make \
' \
set -x \
&& apt-get update \
&& apt-get install -y --no-install-recommends $buildDeps \
&& rm -r /var/lib/apt/lists/* \
\
&& curl -fSL "$HTTPD_BZ2_URL" -o httpd.tar.bz2 \
&& curl -fSL "$HTTPD_BZ2_URL.asc" -o httpd.tar.bz2.asc \
# see https://httpd.apache.org/download.cgi#verify
&& export GNUPGHOME="$(mktemp -d)" \
&& gpg --keyserver ha.pool.sks-keyservers.net --recv-keys A93D62ECC3C8EA12DB220EC934EA76E6791485A8 \
&& gpg --batch --verify httpd.tar.bz2.asc httpd.tar.bz2 \
&& rm -r "$GNUPGHOME" httpd.tar.bz2.asc \
\
&& mkdir -p src \
&& tar -xvf httpd.tar.bz2 -C src --strip-components=1 \
&& rm httpd.tar.bz2 \
&& cd src \
\
&& ./configure \
--prefix="$HTTPD_PREFIX" \
--enable-mods-shared=reallyall \
&& make -j"$(nproc)" \
&& make install \
\
&& cd .. \
&& rm -r src \
\
&& sed -ri \
-e 's!^(\s*CustomLog)\s+\S+!\1 /proc/self/fd/1!g' \
-e 's!^(\s*ErrorLog)\s+\S+!\1 /proc/self/fd/2!g' \
"$HTTPD_PREFIX/conf/httpd.conf" \
\
&& apt-get purge -y --auto-remove $buildDeps
COPY httpd-foreground /usr/local/bin/
EXPOSE 80
CMD ["httpd-foreground"]
In the Dockerfile, COPY httpd-foreground /usr/local/bin/
copies the httpd-foreground
script from the current directory into the image as the startup script for the httpd service. Therefore, we need to create a script file named httpd-foreground
locally:
#!/bin/bash
set -e
# Apache gets grumpy about PID files pre-existing
rm -f /usr/local/apache2/logs/httpd.pid
exec httpd -DFOREGROUND
Grant execute permissions to the httpd-foreground
file:
tutorialpro@tutorialpro:~/apache$ chmod +x httpd-foreground
Create an image from the Dockerfile, replacing it with your own name:
tutorialpro@tutorialpro:~/apache$ docker build -t httpd .
After creation, we can find the newly created image in our local image list:
tutorialpro@tutorialpro:~/apache$ docker images httpd
REPOSITORY TAG IMAGE ID CREATED SIZE
httpd latest da1536b4ef14 23 seconds ago 195.1 MB
Using the Apache Image
docker run -p 80:80 -v $PWD/www/:/usr/local/apache2/htdocs/ -v $PWD/conf/httpd.conf:/usr/local/apache2/conf/httpd.conf -v $PWD/logs/:/usr/local/apache2/logs/ -d httpd
Command Explanation:
-p 80:80: The first 80 is the host port, and the second is the container port, resulting in the container's 80 port being mapped to the host's 80 port.
-v $PWD/www/:/usr/local/apache2/htdocs/: Mounts the www directory in the current directory of the host to /usr/local/apache2/htdocs/ in the container.
-v $PWD/conf/httpd.conf:/usr/local/apache2/conf/httpd.conf: Mounts the conf/httpd.conf file in the current directory of the host to /usr/local/apache2/conf/httpd.conf in the container.
-v $PWD/logs/:/usr/local/apache2/logs/: Mounts the logs directory in the current directory of the host to /usr/local/apache2/logs/ in the container.
For more detailed command reference: Docker run command
Checking Container Startup Status:
tutorialpro@tutorialpro:~/apache$ docker ps
CONTAINER ID IMAGE COMMAND ... PORTS NAMES
79a97f2aac37 httpd "httpd-foreground" ... 0.0.0.0:80->80/tcp sharp_swanson
Access via Browser:
```