Mastering Docker for Laravel: From Local Development to Production Deployment
    A Comprehensive Guide to Setting Up Laravel with Docker in Both Local and Production Environments
    March 10, 2024

    Mastering Docker for Laravel: From Local Development to Production Deployment

    In the world of web development, Docker has emerged as a game-changer, offering a consistent and reproducible environment for both local development and production deployment. This guide will walk you through setting up a Laravel application using Docker, covering both local development and production deployment scenarios. We'll explore how to leverage Docker to create a seamless development workflow, from coding to deploying your Laravel application on a production server like DigitalOcean.

    Local Development Environment Setup

    For local development, you'll want to ensure that your Docker setup is optimized for development purposes. This includes having the latest versions of PHP and MySQL to take advantage of the latest features and improvements.

    Dockerfile for Local Development

    Your Dockerfile for the local development environment might look something like this, using PHP 8.3 and MySQL 8:

    # Build Stage
    FROM composer:2.0 as build
    COPY. /app/
    RUN composer install --prefer-dist --no-dev --optimize-autoloader --no-interaction
    
    # Development Stage
    FROM php:8.3-fpm as development
    
    ENV APP_ENV=development
    ENV APP_DEBUG=true
    
    RUN docker-php-ext-install pdo pdo_mysql
    COPY --from=build /app /var/www/html
    COPY docker/php/conf.d/opcache.ini /usr/local/etc/php/conf.d/opcache.ini
    

    docker-compose.yml for Local Development

    Your docker-compose.yml for local development might look like this:

    version: '3'
    services:
      app:
        build:
          context:.
          dockerfile: Dockerfile
        container_name: laravel_app
        restart: unless-stopped
        tty: true
        environment:
          SERVICE_NAME: app
          SERVICE_TAGS: dev
        working_dir: /var/www/html
        volumes:
          -./:/var/www/html
          -./storage:/var/www/html/storage
        networks:
          - app-network
    
      db:
        image: mysql:8
        container_name: mysql
        restart: unless-stopped
        tty: true
        ports:
          - "3306:3306"
        environment:
          MYSQL_DATABASE: laravel
          MYSQL_ROOT_PASSWORD: your_root_password
          SERVICE_TAGS: dev
          SERVICE_NAME: mysql
        volumes:
          - dbdata:/var/lib/mysql
        networks:
          - app-network
    
    networks:
      app-network:
        driver: bridge
    
    volumes:
      dbdata:
        driver: local
    

    Production Environment Setup

    For the production environment, you'll want to optimize your Docker setup for performance and security. This includes using PHP 8.3 and MySQL 8, as well as configuring your application and Docker environment for production use.

    Dockerfile for Production

    Your Dockerfile for the production environment might look something like this:

    # Production Stage
    FROM php:8.3-fpm as production
    
    ENV APP_ENV=production
    ENV APP_DEBUG=false
    
    RUN docker-php-ext-install pdo pdo_mysql
    COPY --from=build /app /var/www/html
    COPY docker/php/conf.d/opcache.ini /usr/local/etc/php/conf.d/opcache.ini
    

    docker-compose.yml for Production

    Your docker-compose.yml for production might look like this:

    version: '3'
    services:
      app:
        build:
          context:.
          dockerfile: Dockerfile
        container_name: laravel_app
        restart: unless-stopped
        tty: true
        environment:
          SERVICE_NAME: app
          SERVICE_TAGS: prod
        working_dir: /var/www/html
        volumes:
          -./:/var/www/html
          -./storage:/var/www/html/storage
        networks:
          - app-network
    
      db:
        image: mysql:8
        container_name: mysql
        restart: unless-stopped
        tty: true
        ports:
          - "3306:3306"
        environment:
          MYSQL_DATABASE: laravel
          MYSQL_ROOT_PASSWORD: your_root_password
          SERVICE_TAGS: prod
          SERVICE_NAME: mysql
        volumes:
          - dbdata:/var/lib/mysql
        networks:
          - app-network
    
    networks:
      app-network:
        driver: bridge
    
    volumes:
      dbdata:
        driver: local
    

    Note

    By using PHP 8.3 and MySQL 8 in your Docker setup, you're leveraging the latest versions of these technologies, which can offer improved performance, new features, and better security. Remember to adjust your Dockerfiles and docker-compose.yml files according to your specific application requirements and environment configurations.

    Conclusion

    Docker provides a powerful and flexible way to manage both local development and production deployments of Laravel applications. By following the steps outlined in this guide, you can ensure a smooth development workflow and a seamless transition to production. Whether you're developing locally or deploying to a production server, Docker offers the consistency and control needed to maintain high-quality applications.

    Share with the post url and description