Consent

This site uses third party services that need your consent.

Skip to content
Steven Roland
  • The Power of Docker for Local Laravel Development

    Docker has revolutionized the way developers set up and manage their local development environments, especially for Laravel applications. This guide will walk you through the process of creating a streamlined Docker setup for your Laravel projects, offering flexibility and ease of use.

    Why Docker?

    Docker allows you to package your application and its dependencies into containers, ensuring consistency across different environments. For Laravel developers, this means:

    1. Easy management of multiple projects with different PHP versions

    2. Isolation of environments to prevent conflicts

    3. Quick setup and teardown of development environments

    4. Replication of production environments locally

    Setting Up Your Docker Environment

    To get started, you'll need to install Docker on your machine. Once installed, create a project structure like this:

    my-project.com/
    ├── nginx/
    │   └── default.conf
    ├── src/
    │   └── (Laravel app files)
    ├── docker-compose.yml
    └── Dockerfile

    Creating the Docker Compose File

    The docker-compose.yml file is the heart of your Docker setup. It defines the services that make up your application stack. Here's a basic structure:

    version: '3'
    networks:
      laravel:
    services:
      # Services will be defined here

    Adding Nginx

    Add the following Nginx service to your docker-compose.yml:

    nginx:
      image: nginx:stable-alpine
      container_name: nginx
      ports:
        - "8080:80"
      volumes:
        - ./src:/var/www
        - ./nginx/default.conf:/etc/nginx/conf.d/default.conf
      depends_on:
        - php
        - mysql
      networks:
        - laravel

    This sets up an Nginx container using the Alpine Linux image, maps ports, and links volumes.

    Adding MySQL

    Next, add the MySQL service:

    mysql:
      image: mysql:5.7.29
      container_name: mysql
      restart: unless-stopped
      tty: true
      ports:
        - "3306:3306"
      environment:
        MYSQL_DATABASE: homestead
        MYSQL_USER: homestead
        MYSQL_PASSWORD: secret
        MYSQL_ROOT_PASSWORD: secret
        SERVICE_TAGS: dev
        SERVICE_NAME: mysql
      networks:
        - laravel

    This sets up a MySQL 5.7 container with default Laravel credentials.

    Adding PHP

    For PHP, we'll create a custom image. Add this to your docker-compose.yml:

    php:
      build:
        context: .
        dockerfile: Dockerfile
      container_name: php
      volumes:
        - ./src:/var/www
      ports:
        - "9000:9000"
      networks:
        - laravel

    Then, create a Dockerfile in your project root:

    FROM php:7.2-fpm-alpine
    RUN docker-php-ext-install pdo pdo_mysql

    This sets up a PHP-FPM container with necessary extensions for Laravel.

    Configuring Nginx

    In your nginx/default.conf file, add a basic Nginx configuration for Laravel:

    server {
        listen 80;
        index index.php index.html;
        server_name localhost;
        error_log  /var/log/nginx/error.log;
        access_log /var/log/nginx/access.log;
        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 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;
        }
    }

    Starting Your Docker Environment

    To start your Docker environment, run:

    docker-compose build
    docker-compose up -d

    This builds the custom PHP image and starts all containers in detached mode.

    Configuring Laravel

    Update your Laravel .env file:

    DB_HOST=mysql
    APP_URL=http://localhost:8080

    Accessing Your Application

    Your Laravel application should now be accessible at http://localhost:8080.

    Running Laravel Commands

    To run Laravel commands, use:

    docker-compose exec php php /var/www/artisan migrate

    This executes the command within the PHP container.

    Conclusion

    Docker provides a powerful, flexible environment for Laravel development. While it may have a slight performance trade-off compared to bare-metal setups, the benefits of consistency, isolation, and ease of use make it an excellent choice for many developers.

    More posts

    Creating Smooth Flash Messages with Alpine.js

    Learn how to create smooth, auto-fading flash messages using Alpine.js. This tutorial covers setting up Alpine.js, structuring HTML, implementing visibility logic, and adding CSS transitions for a polished user feedback system in web applications.

    The Myth of Geographical Cures: Wisdom from Neil Gaiman

    Neil Gaiman's quote from "The Graveyard Book" challenges the idea that changing locations can solve our problems. It emphasizes that happiness is internal and that personal growth, not geographical change, is key to contentment.