Run Apache in Docker

This tutorial makes following assumptions:

  1. You are using Ubuntu. It might also work in other Debian based Linux systems, although not guaranteed.
  2. You have already set-up Docker.

Steps to run Apache inside Docker in following:

  1. Create a directory called apache-docker
    mkdir apache-docker
    cd apache-docker
  2. Create Dockerfile and open in text editor
    touch Dockerfile
    nano Dockerfile
  3. Use ubuntu:20.04 as base image. You can also use more recent version of ubuntu image.
    FROM ubuntu:20.04
  4. Prevent interactive dialogs like timezone selection
    ARG DEBIAN_FRONTEND=noninteractive
  5. Update package information and perform an upgrade
    RUN apt-get update -y && apt-get upgrade -y
  6. Install Apache
    RUN apt-get install -y apache2
  7. Start Apache server
    CMD /usr/sbin/apache2ctl -D FOREGROUND
  8. Expose port 80 (default port used by Apache server)
    EXPOSE 80
  9. The Dockerfile should look like this:
    FROM ubuntu:20.04
    ARG DEBIAN_FRONTEND=noninteractive
    RUN apt-get update -y && apt-get upgrade -y
    RUN apt-get install -y apache2
    CMD /usr/sbin/apache2ctl -D FOREGROUND
    EXPOSE 80
  10. Build image using the Dockerfile:
    docker build . -t apache-docker-image


    Sending build context to Docker daemon 2.048kB
    Step 1/6 : FROM ubuntu:20.04
    ---> adafef2e596e
    Step 2/6 : ...
    Successfully built e824dca0aa93
    Successfully tagged apache-docker-image:latest
  11. Verify the creation of docker image:
    docker images


    REPOSITORY            TAG      IMAGE ID       CREATED         SIZE
    apache-docker-image   latest   e824dca0aa93   2 minutes ago   210MB
  12. Create and start container using the newly created image
    docker run -it --name apache-docker-container -d -p 8080:80 apache-docker-image
  13. Verify the creation of container
    docker ps


    CONTAINER ID   IMAGE                 COMMAND                  CREATED         STATUS         PORTS                  NAMES
    1220c48d2f78   apache-docker-image   "/bin/sh -c 'apache2…"   7 seconds ago   Up 4 seconds>80/tcp   apache-docker-container
  14. In web browser, open http://localhost:8080. The default page of Apache is displayed.

The next steps describes how to serve files from the host machine instead of default page of Apache.

  1. Create a folder called public and inside it, create index.html with some content
    mkdir public
    echo 'Hello, World!' > public/index.html
  2. Stop and remove running container
    docker stop apache-docker-container
    docker rm apache-docker-container
  3. Create and start container by passing volume flag
    docker run -it --name apache-docker-container -d -p 8080:80 -v ${PWD}/public/:/var/www/html/ apache-docker-image
  4. In web browser, open http://localhost:8080. “Hell, World!” text should be displayed.

The next steps shows how to use docker-composer to easily run docker container.

  1. Create docker-compose.yml file and open in text editor
    touch docker-compose.yml
    nano docker-compose.yml
  2. Copy and paste following code into the docker-compose.yml file
    version: '2.0'
            image: apache-docker
                context: .
                - ./public/:/var/www/html/
                - 8081:80
  3. Start docker container:
    docker-compose up -d
  4. To stop running container:
    docker-compose down

Related Articles: