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 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.
 
First, let’s create a folder for our project and configure the structure for the project:
/docker
   /nginx # folder for nginx settings
   /php   # folder for php settings
   nginx.Dockerfile    # dockerfile for nginx 
   php.Dockerfile      # dockerfile for php 
/mysql # folder for mysql volums, empty folder
/src   # folder where the code of your site will be
docker-compose.yml  # docker conf file with services
   
   
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:
# docker/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
# docker/php/www.conf
[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: Setup Nginx Docker Environment
Create an nginx directory in a docker folder and within it, create a default.conf file and insert the following Nginx server configuration:
# docker/nginx/default.conf
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;
    }
}
In the docker folder of your project, create a file named nginx.Dockerfile.
# docker/nginx.Dockerfile
FROM nginx:stable-alpine
ADD ./docker/nginx/default.conf /etc/nginx/conf.d/default.conf
RUN mkdir -p /var/www/html
Step 3: Create a Docker Compose File
In the root directory of your project, create a docker-compose.yml file. This file allows us to define and manage multi-container Docker applications. Insert the following content:
# docker-compose.yml
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 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
You can verify if the project is working by opening the browser. For example, if port set to 80 in docker-compose.yml:
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
If you need to run composer or artisan, we have made separate services for this case that can be started with commands:
# for composer 
docker compose run --rm composer
# for artisan
docker compose run --rm artisan
Access the Full Project
For the full project, feel free to visit GitHub repository