Skip to the content.

Run Apache in Docker

Apache is a popular web server application.

An Apache docker image is published on Docker Hub.

The following command will start apache.

The container will run in the foreground and log files will be visible in the terminal.

docker run --rm --name apache httpd

Press Cntl-C to stop the container.

Add -d to run the container in the background.

docker run --rm --name apache -d httpd

Run docker ps to confirm that the container is running.

docker ps -a

Note the container is running.

CONTAINER ID        IMAGE               COMMAND              CREATED             STATUS              PORTS               NAMES
b2df9372ee88        httpd               "httpd-foreground"   53 seconds ago      Up 52 seconds       80/tcp              apache

You can view the logs for the container.

docker logs apache

The command above will cat the log file.

AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message
[Wed Dec 16 17:17:24.867258 2020] [mpm_event:notice] [pid 1:tid 140030725198976] AH00489: Apache/2.4.46 (Unix) configured -- resuming normal operations
[Wed Dec 16 17:17:24.868151 2020] [core:notice] [pid 1:tid 140030725198976] AH00094: Command line: 'httpd -D FOREGROUND'

Add -f to tail the log file

docker logs -f apache

Press Cntl-C to exit the log.

Attempt to connect to apache.

From a browser: http://localhost:80

If you already have a web server running on your machine, you will need to stop that web server or skip the next couple steps.

With curl:

curl -v "http://localhost:80"

Note that the connection fails

*   Trying 127.0.0.1...
* TCP_NODELAY set
* Connection failed
* connect to 127.0.0.1 port 80 failed: Connection refused
*   Trying ::1...
* TCP_NODELAY set
* Connection failed
* connect to ::1 port 80 failed: Connection refused
* Failed to connect to localhost port 80: Connection refused
* Closing connection 0
curl: (7) Failed to connect to localhost port 80: Connection refused

Expose a container port

In order to access Apache, we need to expose a port from the container to your desktop.

Stop the existing container

docker stop apache

Restart the container with port 80 from the container mapped to port 80 on your desktop.

Add -p 80:80 to expose port 80 to your desktop

docker run --rm --name apache -d -p 80:80 httpd

Attempt to connect to apache.

From a browser: http://localhost:80

If you already have a web server running on your machine, you will need to stop that web server or skip the next couple steps.

With curl:

curl "http://localhost:80"

Note the success:

<html><body><h1>It works!</h1></body></html>

Run docker ps. Note the port mapping on the container.

docker ps -a
CONTAINER ID        IMAGE               COMMAND              CREATED              STATUS              PORTS                NAMES
eba7c4d0b827        httpd               "httpd-foreground"   About a minute ago   Up About a minute   0.0.0.0:80->80/tcp   apache

Stop the container.

docker stop apache

Map container to a different port

Restart the container with port 80 from the container mapped to port 9999 on your desktop.

Add -p 9999:80 to expose port 80 to port 9999 your desktop

docker run --rm --name apache -d -p 9999:80 httpd

Attempt to connect to apache.

From a browser: http://localhost:9999

With curl:

curl "http://localhost:9999"

Note the success:

<html><body><h1>It works!</h1></body></html>

Run docker ps. Note the port mapping on the container.

docker ps -a
CONTAINER ID        IMAGE               COMMAND              CREATED             STATUS              PORTS                  NAMES
f63163c0e425        httpd               "httpd-foreground"   39 seconds ago      Up 37 seconds       0.0.0.0:9999->80/tcp   apache

Copy content into the container

The httpd container documentation indicates that files will be served from /usr/local/apache2/htdocs/.

Copy a sample file into the apache container.

docker cp examples/session1/copied.txt apache:/usr/local/apache2/htdocs/

View the file in a browser: http://localhost:9999/copied.txt

View the file with curl

curl "http://localhost:9999/copied.txt"
File copied into container.

Stop the container.

docker stop apache

Mount a data volume into the container

In the next example, we will mount a folder of test files into our apache container.

ls examples/session1
README.md       example1.txt    java            ruby
copied.txt      example2.txt    mysql

MacOS/Linux

docker run --rm --name apache -d -p 9999:80 -v "$(pwd)/examples/session1:/usr/local/apache2/htdocs/" httpd

Windows - you must reference the root directory of the container with //

winpty is not needed since a terminal is not being used.

docker run --rm --name apache -d -p 9999:80 -v "$(pwd)/examples/session1://usr/local/apache2/htdocs/" httpd

Use docker exec to verify the directory mount

MacOS/Linux

docker exec -it apache ls /usr/local/apache2/htdocs

Windows

winpty docker exec -it apache ls //usr/local/apache2/htdocs
README.md  copied.txt  example1.txt  example2.txt  java  mysql  ruby

View the following files in a browser or with curl

curl "http://localhost:9999/copied.txt"
File copied into container.
curl "http://localhost:9999/example1.txt"
Example 1
curl "http://localhost:9999/example2.txt"
Example 2

Stop the container.

docker stop apache