Skip to main content
Category:

In this tuto, I'll show you how to create Docker Images with a Dockerfile. Dockerfile allow you to quickly configure and create an image.

Before you create a dockerfile, you should become familiar with the dockerfile command. There are some dockerfile commands you must know:

FROM: allows you to define from which base your image has been created.
MAINTAINER: Optional, it contains the name of the maintainer of the image.
RUN: allows you to execute a command during the build process of the docker image.
ADD: allows you to copy a file from the host machine to the new docker image.
EXPOSE: allows to expose a container port to the outside.
CMD: determines the command that will be executed when the container starts.
ENTRYPOINT: Define the default command that will be executed when the container is running.
WORKDIR: allows you to define the working folder for all other commands (for example RUN, CMD, ENTRYPOINT and ADD)
ENV: allows you to define environment variables which can then be modified using the command parameter run --env <key>=<value>.
VOLUME: Enable access/linked directory between the container and the host machine.

Example:

Create Dockerfile file like this:

FROM debian:buster-slim

# 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 $HTTPD_PREFIX/bin:$PATH
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 set -eux; \
   apt-get update; \
   apt-get install -y --no-install-recommends \
      libapr1-dev \
      libaprutil1-dev \
      libaprutil1-ldap \
   ; \
   rm -rf /var/lib/apt/lists/*

ENV HTTPD_VERSION 2.4.39
ENV HTTPD_SHA256 b4ca9d05773aa59b54d66cd8f4744b945289f084d3be17d7981d1783a5decfa2

# https://httpd.apache.org/security/vulnerabilities_24.html
ENV HTTPD_PATCHES=""

# see https://httpd.apache.org/docs/2.4/install.html#requirements
RUN set -eux; \
   \
   # mod_http2 mod_lua mod_proxy_html mod_xml2enc
   # https://anonscm.debian.org/cgit/pkg-apache/apache2.git/tree/debian/control?id=adb6f181257af28ee67af15fc49d2699a0080d4c
   savedAptMark="$(apt-mark showmanual)"; \
   apt-get update; \
   apt-get install -y --no-install-recommends \
      bzip2 \
      ca-certificates \
      dirmngr \
      dpkg-dev \
      gcc \
      gnupg \
      libbrotli-dev \
      libcurl4-openssl-dev \
      libjansson-dev \
      liblua5.2-dev \
      libnghttp2-dev \
      libpcre3-dev \
      libssl-dev \
      libxml2-dev \
      make \
      wget \
      zlib1g-dev \
   ; \
   rm -r /var/lib/apt/lists/*; \
   \
   ddist() { \
      local f="$1"; shift; \
      local distFile="$1"; shift; \
      local success=; \
      local distUrl=; \
      for distUrl in \
# https://issues.apache.org/jira/browse/INFRA-8753?focusedCommentId=14735394#comment-14735394
         'https://www.apache.org/dyn/closer.cgi?action=download&filename=' \
# if the version is outdated (or we're grabbing the .asc file), we might have to pull from the dist/archive :/
         https://www-us.apache.org/dist/ \
         https://www.apache.org/dist/ \
         https://archive.apache.org/dist/ \
      ; do \
         if wget -O "$f" "$distUrl$distFile" && [ -s "$f" ]; then \
            success=1; \
            break; \
         fi; \
      done; \
      [ -n "$success" ]; \
   }; \
   \
   ddist 'httpd.tar.bz2' "httpd/httpd-$HTTPD_VERSION.tar.bz2"; \
   echo "$HTTPD_SHA256 *httpd.tar.bz2" | sha256sum -c -; \
   \
# see https://httpd.apache.org/download.cgi#verify
   ddist 'httpd.tar.bz2.asc' "httpd/httpd-$HTTPD_VERSION.tar.bz2.asc"; \
   export GNUPGHOME="$(mktemp -d)"; \
   for key in \
# gpg: key 791485A8: public key "Jim Jagielski (Release Signing Key) <jim@apache.org>" imported
      A93D62ECC3C8EA12DB220EC934EA76E6791485A8 \
# gpg: key 995E35221AD84DFF: public key "Daniel Ruggeri (https://home.apache.org/~druggeri/) <druggeri@apache.org>" imported
      B9E8213AEFB861AF35A41F2C995E35221AD84DFF \
   ; do \
      gpg --batch --keyserver ha.pool.sks-keyservers.net --recv-keys "$key"; \
   done; \
   gpg --batch --verify httpd.tar.bz2.asc httpd.tar.bz2; \
   command -v gpgconf && gpgconf --kill all || :; \
   rm -rf "$GNUPGHOME" httpd.tar.bz2.asc; \
   \
   mkdir -p src; \
   tar -xf httpd.tar.bz2 -C src --strip-components=1; \
   rm httpd.tar.bz2; \
   cd src; \
   \
   patches() { \
      while [ "$#" -gt 0 ]; do \
         local patchFile="$1"; shift; \
         local patchSha256="$1"; shift; \
         ddist "$patchFile" "httpd/patches/apply_to_$HTTPD_VERSION/$patchFile"; \
         echo "$patchSha256 *$patchFile" | sha256sum -c -; \
         patch -p0 < "$patchFile"; \
         rm -f "$patchFile"; \
      done; \
   }; \
   patches $HTTPD_PATCHES; \
   \
   gnuArch="$(dpkg-architecture --query DEB_BUILD_GNU_TYPE)"; \
   ./configure \
      --build="$gnuArch" \
      --prefix="$HTTPD_PREFIX" \
      --enable-mods-shared=reallyall \
      --enable-mpms-shared=all \
   ; \
   make -j "$(nproc)"; \
   make install; \
   \
   cd ..; \
   rm -r src man manual; \
   \
   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' \
      -e 's!^(\s*TransferLog)\s+\S+!\1 /proc/self/fd/1!g' \
      "$HTTPD_PREFIX/conf/httpd.conf" \
      "$HTTPD_PREFIX/conf/extra/httpd-ssl.conf" \
   ; \
   \
# reset apt-mark's "manual" list so that "purge --auto-remove" will remove all build dependencies
   apt-mark auto '.*' > /dev/null; \
   [ -z "$savedAptMark" ] || apt-mark manual $savedAptMark; \
   find /usr/local -type f -executable -exec ldd '{}' ';' \
      | awk '/=>/ { print $(NF-1) }' \
      | sort -u \
      | xargs -r dpkg-query --search \
      | cut -d: -f1 \
      | sort -u \
      | xargs -r apt-mark manual \
   ; \
   apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false; \
   \
# smoke test
   httpd -v

COPY httpd-foreground /usr/local/bin/

EXPOSE 80
CMD ["httpd-foreground"]

Build New Docker Image and Create New Container Based on it:

use this command line to build new docker image: 

docker build -t codimth_apache .

Now run the new container with the command below:

docker run -d -p 80:80 codimth_apache

For testing open the web browser and type the host machine IP address like this:

http://127.0.0.1:80

Riadh Rahmi

Senior Web Developer PHP/Drupal & Laravel

I am a senior web developer, I have experience in planning and developing large scale dynamic web solutions especially in Drupal & Laravel.