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, including a series of articles for beginner programmers!
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, including a series of articles for beginner programmers!
Top comments (0)