Dockerizing a Laravel App: Nginx, MySql, PhpMyAdmin, and Php-8.2
syed kamruzzaman
Posted on July 8, 2024
What is Docker?
Docker is an open-source platform that enables developers to automate the deployment, scaling, and management of applications using containerization. Containers package an application and its dependencies into a single, lightweight unit that runs consistently across different computing environments.
Why Do We Need Docker?
Consistency Across Environments: Docker ensures that your application runs the same way regardless of where it’s deployed — whether on a developer’s local machine, a testing server, or in production. This eliminates the “it works on my machine” problem.
Isolation: Containers encapsulate everything needed to run an application, ensuring that dependencies, libraries, and configurations are isolated from other applications. This isolation prevents conflicts between different applications on the same host.
Scalability: Docker makes it easy to scale applications horizontally by running multiple container instances. This can be managed dynamically based on load and demand, leading to better resource utilization and performance.
Efficiency: Containers are lightweight and share the host system’s kernel, making them more efficient than traditional virtual machines (VMs) which include a full operating system.
Rapid Deployment: Docker containers can be quickly created, started, stopped, and destroyed. This rapid provisioning accelerates development, testing, and deployment cycles.
Portability: Containers can run on any system that supports Docker, providing great flexibility in deployment choices, whether on-premises or in the cloud.
### Prerequisite Laravel App Setup with Docker
1. Install Docker
- For Windows: Download and install Docker Desktop from the Docker website.
- For macOS: Download and install Docker Desktop from the Docker website.
- For Linux: Follow the instructions on the Docker website for your specific Linux distribution.
Ensure Docker is running by executing the following command in your terminal:
docker –version
2. Install Docker Compose
Docker Compose is a tool for defining and running multi-container Docker applications. It’s often used for setting up complex environments with multiple services (like web servers, databases, etc.).
- For Windows and macOS: Docker Compose is included with Docker Desktop.
- For Linux: Install Docker Compose following the instructions on the Docker Compose installation page.
Verify the installation by running:
docker-compose –version
### Set Up a Laravel Project
If you don’t have a Laravel project already, you can create a new one. If you already have a Laravel project, skip this step.
composer create-project laravel/laravel example-app
cd example-app
### Dockerize Laravel application
1. Create a Dockerfile in your root project
A Dockerfile is a script that contains instructions on how to build a Docker image for your application.
Dockerfile
FROM php:8.2-fpm-alpine
ARG user
ARG uid
RUN apk update && apk add \
curl \
libpng-dev \
libxml2-dev \
zip \
unzip \
shadow # Add shadow package to install useradd
RUN docker-php-ext-install pdo pdo_mysql \
&& apk --no-cache add nodejs npm
COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer
#USER root
#RUN chmod 777 -R /var/www/
RUN useradd -G www-data,root -u $uid -d /home/$user $user
RUN mkdir -p /home/$user/.composer && \
chown -R $user:$user /home/$user
WORKDIR /var/www
USER $user
Here we pass two Arguments one is user and the other is uid for create a new user and other permission.
2. Create a docker-compose folder. And inside this folder create the below folder
- Mysql
- Nginx
- - ssl
- Php
- Redis
- - data Like this way
Here are other files we will create later.
3. Create a docker-compose.yml file in your root project
docker-compose.yml
version: "3.7"
services:
####################################################################################################
# app
####################################################################################################
app:
build:
args:
user: developer
uid: 1000
context: ./
dockerfile: Dockerfile
image: app
container_name: app-rifive-laravel
restart: unless-stopped
environment:
VIRTUAL_HOST: laravel.test
working_dir: /var/www/
volumes:
- ./:/var/www
- ~/.ssh:/root/.ssh
depends_on:
- db
- redis
networks:
- laravel
####################################################################################################
# DATABASE (MySQL)
####################################################################################################
db:
image: mysql:8.0
container_name: mysql-rifive-laravel
restart: unless-stopped
ports:
- "3306:3306"
environment:
MYSQL_DATABASE: ${DB_DATABASE}
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
MYSQL_PASSWORD: ${DB_PASSWORD}
MYSQL_USER: ${DB_USERNAME}
SERVICE_TAGS: dev
SERVICE_NAME: mysql
volumes:
- ./docker-compose/mysql/data:/var/lib/mysql
- ./docker-compose/mysql/logs:/var/log/mysql
- ./docker-compose/mysql/ql:/docker-entrypoint-initdb.d
networks:
- laravel
####################################################################################################
# Nginx
####################################################################################################
nginx:
image: nginx:alpine
container_name: nginx-rifive-laravel
restart: unless-stopped
ports:
- 80:80
- 443:443
volumes:
- ./:/var/www
- ./docker-compose/nginx:/etc/nginx/conf.d
- ./docker-compose/nginx/ssl:/etc/nginx/conf.d/ssl
- ./docker-compose/nginx/phpmyadmin.conf:/etc/nginx/conf.d/phpmyadmin.conf
networks:
- laravel
####################################################################################################
# phpMyAdmin
####################################################################################################
phpmyadmin:
image: phpmyadmin/phpmyadmin:latest
container_name: phpmyadmin-rifive-laravel
ports:
- 8080:80
links:
- db
restart: unless-stopped
environment:
PMA_HOST: db
#PMA_USER: ${DB_USERNAME}
#PMA_PASSWORD: ${DB_PASSWORD}
PMA_PORT: 3306
PMA_ARBITRARY: 1
networks:
- laravel
####################################################################################################
# Redis
####################################################################################################
redis:
image: "redis:alpine"
container_name: ri-rifive-redis
restart: unless-stopped
volumes:
- ./docker-compose/redis/data:/data
ports:
- "6379:6379"
networks:
- laravel
networks:
laravel:
driver: bridge
here we create 5 image
- Laravel App
- Database MySQL
- Nginx
- PhpMyAdmin
- Redis
4. Create a Necessary file for nginx. Go to docker-compose/nginx Folder and create these files
laravel.conf
server {
listen 80;
server_name laravel.test;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name laravel.test;
index index.php index.html;
error_log /var/log/nginx/error.log;
access_log /var/log/nginx/access.log;
root /var/www/public;
ssl_certificate /etc/nginx/conf.d/ssl/self-signed.crt;
ssl_certificate_key /etc/nginx/conf.d/ssl/self-signed.key;
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass app:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
location / {
try_files $uri $uri/ /index.php?$query_string;
gzip_static on;
}
}
phpMyAdmin.conf
server {
listen 80;
server_name phpmyadmin.laravel.test;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name phpmyadmin.laravel.test;
index index.php index.html;
error_log /var/log/nginx/error.log;
access_log /var/log/nginx/access.log;
root /usr/share/nginx/html;
ssl_certificate /etc/nginx/conf.d/ssl/self-signed.crt;
ssl_certificate_key /etc/nginx/conf.d/ssl/self-signed.key;
location / {
proxy_pass http://phpmyadmin:80;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
**
::::Now run docker Container::::
**
docker compose up –build
when build is complete then run this command
docker compose exec -it app sh
Now you can see your shell terminal. If you run whoami command then you see developer as a user. Run below this command
cd docker-compose/nginx/ssl/
openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout self-signed.key -out self-signed.crt
This command creates two files in your docker-compose/nginx/ssl folder.
- self-signed.crt
- self-signed.key Like this picture
Now run this command
cd /var/www
php artisan migrate
now you exit shell command and your application will be ready for run. Hit this URL
Laravel App
https://localhost
PhpMyAdmin
http://localhost:8080/
That’s all. Happy Learning :) .
[if it is helpful, giving a star to the repository 😇]
Posted on July 8, 2024
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.