Host two different Apache and PHP versions with Docker
Tags: docker, php, webdev
Published: 2020-04-30 19:28:35

For one of my personal projects, I needed to have two different different PHP versions running at the same time of my server. And those two PHP versions needed to run on different apache version because one was incompatible.

*Find more articles about programming on [my personal blog](https://www.mindflash.org/), including a series of articles for [beginner programmers](https://www.mindflash.org/category/coding/learn-programming)!*

To do that you will actually need 3 containers:

- 1 reverse proxy with Nginx
- 1 docker with the first version of Apache & PHP
- 1 docker with the second version of Apache & PHP

## The reverse proxy

Here is the docker file for your reverse proxy:

```
FROM debian:jessie

MAINTAINER Antwane version: 0.1

RUN apt-get update && \
    apt-get install -y --force-yes \
            nginx \
        nano

EXPOSE 80
EXPOSE 443

ADD ./proxy.conf /etc/nginx/conf.d/proxy.conf

CMD ["nginx"]
```

And here is the configuration file for the proxy:

```
proxy_redirect          off;
proxy_set_header        Host            $host;
proxy_set_header        X-Real-IP       $remote_addr;
proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size    10m;
client_body_buffer_size 128k;
client_header_buffer_size 64k;
proxy_connect_timeout   90;
proxy_send_timeout      90;
proxy_read_timeout      90;
proxy_buffer_size   16k;
proxy_buffers       32   16k;
proxy_busy_buffers_size 64k;
```

Here's the command to launch in order to run it:

```
docker run -ti -d -p 80:80 -v /home/<your-user>/Docker/images/nginxproxy/virtualhosts:/etc/nginx/sites-enabled --name nginxproxy nginxproxy /bin/bash
```

In `/home/<your-user>/Docker/images/nginxproxy/virtualhosts`, you should put a file with the configuration of your nginx, that will redirect each website to the correct apache container:

```
server {
       listen 80;

       server_name  siteZ.com;
       location / {
            proxy_pass http://apache22php53:80;
       }
}

server {
       listen 80;

       server_name  siteA.com;
       location / {
            proxy_pass http://apache24php56:80;
       }
}
server {
       listen 80;

       server_name  siteB.com;
       location / {
            proxy_pass http://apache24php56:80;
       }
}
```

## The first container

For the purpose of the example, I will use Apache 2.2 and PHP 5.3 in the first container:

```
FROM debian:wheezy

MAINTAINER Antwane version: 0.1

RUN apt-get update

RUN echo "deb http://packages.dotdeb.org squeeze all" > /etc/apt/sources.list.d/dotdeb_squeeze.list
RUN echo "deb-src http://packages.dotdeb.org squeeze all" >> /etc/apt/sources.list.d/dotdeb_squeeze.list
RUN echo "deb http://ftp.debian.org/debian/ squeeze main contrib non-free" >> /etc/apt/sources.list.d/dotdeb_squeeze.list

RUN echo "Package: *php*" > /etc/apt/preferences.d/php53.pref
RUN echo "Pin: release o=packages.dotdeb.org,n=squeeze" >> /etc/apt/preferences.d/php53.pref
RUN echo "Pin-Priority: 989" >> /etc/apt/preferences.d/php53.pref

RUN apt-get update && \
    apt-get install -y --force-yes \
            apache2 \
        php5 \
        php5-curl \
        php5-gd \
        php5-mysql \
        nano

RUN a2enmod \
            php5 \
        rewrite

ENV APACHE_RUN_USER www-data
ENV APACHE_RUN_GROUP    www-data
ENV APACHE_LOG_DIR  /var/log/apache2
ENV APACHE_LOCK_DIR /var/lock/apache2
ENV APACHE_PID_FILE /var/run/apache2.pid

EXPOSE 80
EXPOSE 443

CMD /usr/sbin/apache2ctl -D FOREGROUND
```

I'm launching it using the following script :

```
docker run -ti -d -p 2253:80 -v /home:/home -v /home/<your username>/Docker/images/apache22php53/virtualhosts:/etc/apache2/sites-enabled --name apache22php53 apache22php53 /bin/bash
```
My websites are stored in `/home/website.com/www`, and my apache virtualhosts are stored on the host in `/home/<your username>/Docker/images/apache22php53/virtualhosts`.

## The second container

Here's the dockerfile:

```
FROM debian:jessie

MAINTAINER Antwane version: 0.1

RUN apt-get update && \
    apt-get install -y --force-yes \
            apache2 \
        php5 \
        php5-curl \
        php5-gd \
        php5-mysql \
        nano

RUN a2enmod \
            php5 \
        rewrite

ENV APACHE_RUN_USER www-data
ENV APACHE_RUN_GROUP    www-data
ENV APACHE_LOG_DIR  /var/log/apache2
ENV APACHE_LOCK_DIR /var/lock/apache2
ENV APACHE_PID_FILE /var/run/apache2.pid

EXPOSE 80
EXPOSE 443

CMD /usr/sbin/apache2ctl -D FOREGROUND
```

And how to run it:

```
docker run -ti -d -p 2456:80 -v /home:/home -v /home/<your username>/Docker/images/apache24php56/virtualhosts:/etc/apache2/sites-enabled --name apache24php56 apache24php56 /bin/bash
```

## Conclusion

You can now run many different versions of Apache and PHP on the same host using Docker! The interesting point is that you can scale that as much as needed, just by deploying a new Apache container, and adding your new website to your reverse proxy!

*Find more articles about programming on [my personal blog](https://www.mindflash.org/), including a series of articles for [beginner programmers](https://www.mindflash.org/category/coding/learn-programming)!*