Are you still using virtual machines like a sucker? here’s the complete guide to the future, it’s called containerization.
I’ve been using chroot for years, not only for webpages with the php-fpm, but also for services like Postfix, Dovecot and Bind.
My choice of OS on the host server is of course Debian but the container does not need such a heavy base. There is another distro called Alpine which is only a few Mb.
Imagine the difference in a large scale containerization environment
If you haven’t got docker yet
# apt update
# apt install apt-transport-https ca-certificates curl gnupg2 software-properties-common
# curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -
# vim /etc/apt/sources.list
Don’t forget to change the distribution name if you’re not running buster!
deb [arch=amd64] https://download.docker.com/linux/debian buster stable
# apt update && apt install docker-ce docker-compose
Lets go ahead and create our DAMP server
First we will create our “repository
# mkdir -p /opt/docker/apache-php-mariadb
# cd /opt/docker/apache-php-mariadb
# mkdir apache php mariadb html
Set up the environment variables
# nvim .env
PHP_VERSION=7.3 MARIADB_VERSION=10.3 APACHE_VERSION=2.4 PHP_NAME=0-php MARIADB_NAME=db APACHE_NAME=web ADMINER_NAME=adminer NET_BACKEND=backend NET_FRONTEND=frontend DB_ROOT_PASSWORD=abc123 DB_NAME=wp DB_USERNAME=user DB_PASSWORD=123abc
And the compose file
# nvim docker-compose.yml
version: "3.2" services: php: build: context: './php/' args: PHP_VERSION: ${PHP_VERSION} networks: - backend volumes: - ./html/:/var/www/html/ container_name: "${PHP_NAME}" apache: build: context: './apache/' args: APACHE_VERSION: ${APACHE_VERSION} depends_on: - php - mariadb networks: - backend - frontend ports: - "80:80" volumes: - ./html/:/var/www/html/ container_name: "${APACHE_NAME}" mariadb: image: mariadb:${MARIADB_VERSION:-latest} restart: always ports: - "3306:3306" volumes: - ./mariadb:/var/lib/mysql networks: - backend environment: MYSQL_ROOT_PASSWORD: "${DB_ROOT_PASSWORD}" MYSQL_DATABASE: "${DB_NAME}" MYSQL_USER: "${DB_USERNAME}" MYSQL_PASSWORD: "${DB_PASSWORD}" container_name: "${MARIADB_NAME}" adminer: image: adminer ports: - 8080:8080 networks: - backend restart: always container_name: "${ADMINER_NAME}" networks: backend: frontend:
Create a vhost
# nvim apache/demo.apache.conf
ServerName localhost LoadModule deflate_module /usr/local/apache2/modules/mod_deflate.so LoadModule proxy_module /usr/local/apache2/modules/mod_proxy.so LoadModule proxy_fcgi_module /usr/local/apache2/modules/mod_proxy_fcgi.so <VirtualHost *:80> # Proxy .php requests to port 9000 of the php-fpm container ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://php:9000/var/www/html/$1 DocumentRoot /var/www/html/ <Directory /var/www/html/> DirectoryIndex index.php Options Indexes FollowSymLinks AllowOverride All Require all granted </Directory> # Send apache logs to stdout and stderr CustomLog /proc/self/fd/1 common ErrorLog /proc/self/fd/2 </VirtualHost>
nvim apache/Dockerfile
ARG APACHE_VERSION="" FROM httpd:${APACHE_VERSION:+${APACHE_VERSION}-}alpine RUN apk update; \ apk upgrade; RUN apk add \ bash \ apache2 \ php7-apache2 \ curl \ ca-certificates \ openssl \ git \ php7 \ php7-phar \ php7-json \ php7-iconv \ php7-openssl \ tzdata \ openntpd \ php7-ftp \ php7-xdebug \ php7-mcrypt \ php7-mbstring \ php7-soap \ php7-gmp \ php7-pdo_odbc \ php7-dom \ php7-pdo \ php7-zip \ php7-mysqli \ php7-sqlite3 \ php7-bcmath \ php7-gd \ php7-odbc \ php7-pdo_mysql \ php7-pdo_sqlite \ php7-gettext \ php7-xmlreader \ php7-xmlwriter \ php7-tokenizer \ php7-xmlrpc \ php7-bz2 \ php7-pdo_dblib \ php7-curl \ php7-ctype \ php7-session \ php7-exif; RUN sed -i "s/#LoadModule\ rewrite_module/LoadModule\ rewrite_module/" /usr/local/apache2/conf/httpd.conf; COPY .bashrc /root/.bashrc # Copy apache vhost file to proxy php requests to php-fpm container COPY demo.apache.conf /usr/local/apache2/conf/demo.apache.conf RUN echo "Include /usr/local/apache2/conf/demo.apache.conf" \ >> /usr/local/apache2/conf/httpd.conf
#nvim php/Dockerfile
ARG PHP_VERSION="" FROM php:${PHP_VERSION:+${PHP_VERSION}-}fpm-alpine RUN apk update; \ apk upgrade; #RUN docker-php-ext-install mysqli #RUN docker-php-ext-install pdo pdo_mysql