🐳 This is a simple Docker Compose workflow that sets up a LAMP network of containers for local development. This also allows customizing the optional PHP version 🐘
This configuration can be used for any PHP project (Laravel, Yii, CodeIgniter, Pure PHP, etc.) 🎉
- Configuration requirements
- Add your custom bash script to run docker
- Installation and Setup
- Check the network ID and connect Database
Other docker configs: LEMP Stack (Nginx, PHP, MariaDB, Redis) 🐳
Because maybe my configuration is not enough for the configuration required by your project or purpose, you need to add more configuration to the docker.
With nature of allowing you to customize the PHP version according to your. We should also allow custom bash scripts to run when starting the docker.
So, you can add your custom bash script to run docker in the file docker/bash/custom.sh with the following steps:
Run:
cd docker/bash
cp custom.sh.example custom.sh
Then, you can add your custom bash script to run docker in the file docker/bash/custom.sh.
For example, you want to install ngrok extension for your docker container:
#!/bin/bash
# Install ngrok
snap install ngrok
# Install ngrok for php
docker-php-ext-install ngrok
# You can install other extensions here
# docker-php-ext-install <extension_name>
# etc.
npm install -g localtunnel
And now, just follow the steps below and run the docker.
To use the optional PHP image, you need an additional web server, such as Apache, that can proxy HTTP-request to the Apache-pot of the container. This is not a requirement for the fpm image but is for the web server.
- Multi-site integration
- PHP optional version with custom in .env file (example: 7.4, 8.0, 8.1, 8.2, etc.)
- Web server: Apache
- DBMS (database management system): Mariadb
- In-memory database: Redis
- SSL Certificate (using mkcert)
Warning: If you don't want to use SSL, you can skip steps 1 and 2 and edit conf files in docker/server/apache/sites-enabled/*.conf to remove the SSL configuration.
Please remove the 443 port in docker/server/apache/sites-enabled/*.conf file and use 80 port for HTTP:
<VirtualHost *:80>
ServerAdmin [email protected]
ServerName local.localhost.com
ServerAlias local.com
DocumentRoot /var/www/local
ErrorLog /var/www/logs/error-local.log
CustomLog /var/www/logs/access-local.log combined
SSLEngine on
SSLCertificateFile /var/www/certs/local.localhost.com.pem
SSLCertificateKeyFile /var/www/certs/local.localhost.com-key.pem
<Directory /var/www/local>
Options +Indexes +Includes +FollowSymLinks +MultiViews
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
If you want to use SSL, please ignore the above warning and follow all the steps below.
Using mkcert to create ssl certificate
sudo apt install libnss3-tools
sudo wget https://github.com/FiloSottile/mkcert/releases/download/v1.4.3/mkcert-v1.4.3-linux-amd64 && \
sudo mv mkcert-v1.4.3-linux-amd64 mkcert && \
sudo chmod +x mkcert && \
sudo cp mkcert /usr/local/bin/
Please check and install mkcert at: https://github.com/FiloSottile/mkcert
Now that the mkcert utility is installed, run the command below to generate and install your local CA:
mkcert -install
Go to this docker folder and run:
cd docker/server/certs
mkcert local.localhost.com
mkcert local.lamp.com
Go to this docker folder and run:
cp .env.example .env
PHP_VERSION_SELECTED=8.2 # Choose the PHP version for your project
APP_NAME=lamp-local # name of your docker project
APP_PORT=91 # port for docker server (apache)
SSL_PORT=445 # port for docker server (apache) with SSL
DB_PORT=13393 # port for a database (MariaDB)
MYSQL_ROOT_PASS=root
MYSQL_USER=root
MYSQL_PASS=root
MYSQL_DB=lamp-local # name of your database
PHPMYADMIN_PORT=19011 # port for phpmyadmin (database admin)
PHPMYADMIN_UPLOAD_LIMIT # upload limit for phpmyadmin
IP_DB_SERVER=127.0.0.1
REDIS_PORT=16379 # port for Redis (in-memory database)
Go to this docker folder and run:
docker-compose up -d
- Run
docker ps
to check the Container ID of APP_NAME-db - Run the command
docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <container_ID>
docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <container_ID>
Use the IP address to connect to the database using the database management system (DBMS) of your choice. For example, using MySQL Workbench:
You can also connect to the database using the DB_PORT in the .env file
For example, using MySQL Workbench: DB_PORT=13393
This is a demo of the project with the environment variable PHP_VERSION_SELECTED=8.2