So You Want to Docker-ize Your Laravel App? Buckle Up, Buttercup!
Ah, Laravel. The sassy dame of PHP frameworks. And Docker? The tattooed bad-boy of containerization. Putting these two together is a match made in developer heaven, but let's be honest, the initial setup can feel like wrangling toddlers on a sugar high. Fear not, fellow code cowboy! This here guide will have your Laravel application running smoother than a greased pig in a mudslide, all within the cozy confines of a Docker container.
Prerequisites: Not Your Boring Old Online Dating Must-Haves
Before we dive in, there are a few things you'll need to have installed on your machine. Don't worry, it's not like needing a six-pack and a winning smile (although those can't hurt either). Here's the short list:
- Docker: The main squeeze. You can grab it at https://www.docker.com/.
- Docker Compose: Think of it as Docker's wingman. Find it at https://docs.docker.com/compose/install/.
- Composer: Laravel's best friend for managing dependencies. You can install it using your favorite package manager.
Step 1: Forge Your Laravel Weapon
Alright, enough metaphors. First things first, you'll need a brand spanking new Laravel project. Fire up your terminal and unleash the following command:
composer create-project --prefer-dist laravel/laravel my-laravel-app
Replace "my-laravel-app" with something a little more creative, like "project-armageddon" or "procrastination-station" (we've all been there).
Step 2: Let's Get This Party Started (in a Docker Container)
Now comes the fun part: building your Docker empire. We'll need two essential files: a docker-compose.yml file to define the services that make up your application, and a Dockerfile for your Laravel beast itself.
docker-compose.yml is like the blueprint for your containerized world. Here's a basic example:
version: "3.8"
services:
# The web service running our Laravel app
web:
build: .
volumes:
- ./:/var/www/html
ports:
- "8000:80"
environment:
- APP_NAME=my-laravel-app # Replace with your project name
- APP_ENV=local
- DB_CONNECTION=mysql
# Add more environment variables as needed
# The MySQL database service
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD=secret # Don't use "secret" in production!
MYSQL_DATABASE=my-laravel-app # Replace with your database name
volumes:
- mysql-data:/var/lib/mysql
volumes:
mysql-data: {}
Make sure to update the environment variables with your project specifics. This file defines two services: a web service for your Laravel app and a MySQL database service.
The Dockerfile is the instruction manual for building your Docker image. Here's a basic example:
FROM php:8.0-fpm
WORKDIR /var/www/html
COPY composer.json composer.lock ./
RUN apt-get update && apt-get install -y \
gdebi-core \
curl \
libc6-dbg \
sqlite3 \
unzip \
gettext \
bz2 \
libxml2-dev \
libjpeg-dev \
zip \
libpng-dev \
freetype2.4-dev \
libmcrypt-dev \
redis-server \
memcached \
icu-devtools
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
COPY . .
RUN composer install
COPY .env .env.example
EXPOSE 80
CMD [ "php", "-S", "0.0.0.0:80", "-t", "public" ]
This Dockerfile installs all the necessary dependencies for your Laravel application, including PHP, Composer, and extensions. It then copies your project code and runs composer install
to install your project's dependencies. Finally, it exposes port 80 and defines the command to start your Laravel application using the built-in PHP development server.