English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Install Apache with Docker

Method one, docker pull httpd

Search Docker Hub httpd images on:

You can view other versions of httpd by Sort by, the default is the latest version httpd:latest.

In addition, we can also use the docker search httpd command to view available versions:

w3codebox@w3codebox:~/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 0 0 0 0 [OK]
publicisworldwide/httpd The Apache httpd web server... 0 0 0 0 0 [OK]
rgielen/httpd-image-simple Docker image for simple... 0 0 0 0 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

w3codebox@w3codebox:~/apache$ docker pull httpd

After the download is complete, we can find the image with REPOSITORY as httpd in the local image list.

w3codebox@w3codebox:~/apache$ docker images httpd
REPOSITORY     TAG        IMAGE ID        CREATED           SIZE
httpd          latest     da1536b4ef14    23 seconds ago    195.1 MB

Method two: build through Dockerfile

Create Dockerfile

Firstly, create a directory named apache to store the related items later.

w3codebox@w3codebox:~$ mkdir -p ~/apache/www ~/apache/logs ~/apache/conf

The www directory will be mapped to the application directory configured by 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.

Enter 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
# see 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"]

Dockerfile file COPY httpd-foreground /usr/local/bin/ which is the httpd in the current directory-Copy foreground to the image as the startup script for the httpd service, so we need to create a script file httpd locally-foreground

#!/bin/bash
set -e
# Apache gets grumpy about PID files pre-existing
rm -f /usr/local/apache2/logs/httpd.pid
exec httpd -DFOREGROUND

grant httpd-foreground file executable permission.

w3codebox@w3codebox:~/apache$ chmod +x httpd-foreground

Create an image through Dockerfile, replace it with your own name.

w3codebox@w3codebox:~/apache$ docker build -t httpd .

After the creation is complete, we can find the newly created image in the local image list.

w3codebox@w3codebox:~/apache$ docker images httpd
REPOSITORY     TAG        IMAGE ID        CREATED           SIZE
httpd          latest     da1536b4ef14    23 seconds ago    195.1 MB

using the apache image

run container

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 Description:

-p 80:80: Mount the container's 8Port 0 mapped to the host's 8Port 0.

-v $PWD/www/:/usr/local/apache2/htdocs/: Mount the www directory under the current directory of the host to the container's /usr/local/apache2/htdocs/.

-v $PWD/conf/httpd.conf:/usr/local/apache2/conf/httpd.conf: Mount the conf directory under the current directory of the host to the container's/Mount the httpd.conf file to the container's /usr/local/apache2/conf/httpd.conf.

-v $PWD/logs/:/usr/local/apache2/logs/: Mount the logs directory under the current directory of the host to the container's /usr/local/apache2/logs/.

Check container startup status:

w3codebox@w3codebox:~/apache$ docker ps
CONTAINER ID IMAGE COMMAND ... PORTS ... NAMES
79a97f2aac37  httpd "httpd-foreground" ... 0.0.0.0:80->80/tcp sharp_swanson

Access through browser

It works! https://www.oldtoolbag.com