Building and Deploying a Laravel App Using Docker
This tutorial guides you through building and deploying a Laravel application using Docker. The process includes setting up Docker, creating a Dockerfile, and configuring Docker Compose.
Prerequisites
- Docker installed on your system
- Basic understanding of Laravel and Docker
Step 1: Set Up Laravel Project
Create a New Laravel Project:
composer create-project --prefer-dist laravel/laravel my-app
cd my-app
Step 2: Create a Dockerfile
Create a Dockerfile
in the root directory of your Laravel project:
# Use official PHP image as base
FROM php:8.0-fpm
# Set working directory
WORKDIR /var/www
# Install dependencies
RUN apt-get update && apt-get install -y \
build-essential \
libpng-dev \
libjpeg62-turbo-dev \
libfreetype6-dev \
locales \
zip \
jpegoptim optipng pngquant gifsicle \
vim \
unzip \
git \
curl
# Clear cache
RUN apt-get clean && rm -rf /var/lib/apt/lists/*
# Install PHP extensions
RUN docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd
# Install Composer
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
# Copy existing application directory contents
COPY . /var/www
# Copy existing application directory permissions
COPY --chown=www-data:www-data . /var/www
# Change current user to www
USER www-data
# Expose port 9000 and start php-fpm server
EXPOSE 9000
CMD ["php-fpm"]
Step 3: Set Up Docker Compose
Create a docker-compose.yml
file in the root directory:
version: '3.8'
services:
app:
build:
context: .
dockerfile: Dockerfile
image: laravel-app
container_name: laravel-app
restart: unless-stopped
tty: true
environment:
SERVICE_NAME: app
SERVICE_TAGS: dev
working_dir: /var/www
volumes:
- ./:/var/www
- ./php/local.ini:/usr/local/etc/php/conf.d/local.ini
networks:
- app-network
webserver:
image: nginx:alpine
container_name: nginx
restart: unless-stopped
tty: true
ports:
- "8080:80"
volumes:
- ./:/var/www
- ./nginx/conf.d/:/etc/nginx/conf.d/
networks:
- app-network
db:
image: mysql:5.7
container_name: mysql
restart: unless-stopped
tty: true
ports:
- "3306:3306"
environment:
MYSQL_DATABASE: laravel
MYSQL_ROOT_PASSWORD: root
MYSQL_PASSWORD: root
MYSQL_USER: root
volumes:
- dbdata:/var/lib/mysql
networks:
- app-network
networks:
app-network:
driver: bridge
volumes:
dbdata:
driver: local
Step 4: Configure Nginx
Create a nginx/conf.d/app.conf
file with the following content:
server {
listen 80;
index index.php index.html;
server_name localhost;
root /var/www/public;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
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_intercept_errors off;
fastcgi_buffer_size 16k;
fastcgi_buffers 4 16k;
}
location ~ /\.ht {
deny all;
}
}
Step 5: Create PHP Configuration File
Create a php/local.ini
file with the following content:
memory_limit = 256M
upload_max_filesize = 64M
post_max_size = 64M
max_execution_time = 300
Step 6: Build and Run Containers
Run Containers:
docker-compose up -d
Build Containers:
docker-compose build
Step 7: Access the Application
Open your web browser and navigate to http://localhost:8080
. You should see the Laravel welcome page.
Step 8: Manage Containers
Stop Containers:
docker-compose down
Restart Containers:
docker-compose restart
Conclusion
You have successfully built and deployed a Laravel application using Docker. This setup allows for easy scalability and consistency across different environments.
Resources:
Keywords: Laravel, Docker, Docker Compose, PHP, Nginx, MySQL, containerization, web development, deployment