Setting Up a Laravel 11 Development Environment with Docker
Updated June 2024.
Access the Full Project
For the full project, feel free to visit GitHub repository.
With the growing trend of containerization in web development, Docker has become an indispensable tool for developers. Docker allows for seamless management of dependencies and environments, enabling developers to focus on coding. In this article, we’ll guide you through setting up a Laravel 10 development environment using Docker.
Prerequisites
Before starting, make sure the following are installed on your system:
- Docker: Visit Docker’s official website to download and install Docker Desktop.
- Docker Compose: Usually included with Docker Desktop, install separately if it’s not.
Project Structure
Step 1: Setup PHP Docker Environment
In the docker folder of your project, create a file named php.Dockerfile. This file defines the configuration for our Docker container. Add the following content to your php.Dockerfile:
FROM php:8.2-fpm-alpine
ADD ./docker/php/www.conf /usr/local/etc/php-fpm.d/www.conf
RUN addgroup -g 1000 laravel && adduser -G laravel -g laravel -s /bin/sh -D laravel
RUN mkdir -p /var/www/html
ADD ./src/ /var/www/html
RUN docker-php-ext-install pdo pdo_mysql
RUN chown -R laravel:laravel /var/www/html
This Dockerfile creates a Docker container with PHP 8.2 and all the necessary extensions to run a Laravel project.
Create file www.conf based in php folder and add following content
[www]
user = laravel
group = laravel
listen = 127.0.0.1:9000
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
Step 2: Create a Docker Compose File
In the root directory of your Laravel project, create a docker-compose.yml
file. This file allows us to define and manage multi-container Docker applications. Insert the following content:
services:
nginx:
build:
context: .
dockerfile: ./docker/nginx.Dockerfile
depends_on:
- php
- mysql
container_name: laravel_nginx
ports:
- 80:80
- 443:443
volumes:
- ./src:/var/www/html
php:
build:
context: .
dockerfile: ./docker/php.Dockerfile
container_name: laravel_php
volumes:
- ./src:/var/www/html
mysql:
image: mysql:8.0.27
platform: linux/amd64
container_name: laravel_mysql
ports:
- 3306:3306
volumes:
- ./mysql:/var/lib/mysql
environment:
MYSQL_DATABASE: laraveldb
MYSQL_USER: laravel
MYSQL_PASSWORD: secret
MYSQL_ROOT_PASSWORD: secret
composer:
image: composer:latest
container_name: laravel_composer
volumes:
- ./src:/var/www/html
working_dir: /var/www/html
artisan:
build:
context: .
dockerfile: ./docker/php.Dockerfile
container_name: laravel_artisan
volumes:
- ./src:/var/www/html
working_dir: /var/www/html
entrypoint: ['php', 'artisan']
npm:
image: node:current-alpine
container_name: laravel_npm
volumes:
- ./src:/var/www/html
working_dir: /var/www/html
entrypoint: ['npm']
This docker-compose.yml
file creates two services: one for PHP and one for Nginx. It also defines a Docker network that the two services use to communicate.
Step 3: Configure Nginx
In the docker folder of your project, create a file named nginx.Dockerfile.
FROM nginx:stable-alpine
ADD ./docker/nginx/default.conf /etc/nginx/conf.d/default.conf
RUN mkdir -p /var/www/html
Create an nginx
directory in a docker folder and within it, create a default.conf file and insert the following Nginx server configuration:
server {
listen 80;
index index.php index.html;
server_name localhost;
root /var/www/html/public;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
try_files $uri = 404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass php:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
}
Step 4: Build the Docker Containers
Now, we’re ready to build our Docker containers. From the root directory of your Laravel project, run the following command:
docker compose build
Step 5: Create a New Laravel Project
We need to create a new Laravel project. Navigate to the directory where you wish to create your project and run the following command:
docker compose run --rm composer create-project laravel/laravel .
After running this command, the project code should appear in the src folder.
Start docker containers
docker compose up -d
Your Laravel application is now accessible at http://localhost:80
Step 6. Configure Laravel project
Configure Mysql in /src/.env . Uncomment and change:
DB_CONNECTION=mysql # connection name, we use mysql
DB_HOST=mysql # name of mysql service in docker-compose.yml
DB_PORT=3306 # mysql standart port
DB_DATABASE=laraveldb # database name from MYSQL_DATABASE in docker-compose.yml
DB_USERNAME=laravel # username from MYSQL_USER in docker-compose.yml
DB_PASSWORD=secret # user password from MYSQL_PASSWORD in docker-compose.yml
Restart all services
docker compose down
docker compose up -d
Step 7. Run migrations
docker compose run --rm artisan migrate
Congratulations! You’ve now successfully set up a latest version of Laravel development environment with Docker and PHP 8.2.
If you’re interested in similar articles, you might want to explore more on this site.