8-setting-up-docker-containers-for-a-laravel-application-in-production.html

Setting Up Docker Containers for a Laravel Application in Production

In the ever-evolving landscape of web development, deploying applications efficiently and consistently is crucial. Docker has emerged as a game-changer in this realm, enabling developers to create, deploy, and run applications in isolated environments called containers. In this article, we will explore how to set up Docker containers for a Laravel application in production, providing step-by-step instructions, code snippets, and actionable insights to ensure a smooth deployment.

What is Docker?

Docker is a platform that automates the deployment of applications inside lightweight, portable containers. A container is an encapsulated environment that includes everything needed to run an application—code, runtime, libraries, and system tools—ensuring consistency across different environments.

Why Use Docker for Laravel?

Using Docker for Laravel applications offers several advantages:

  • Isolation: Each container runs independently, allowing you to manage dependencies without conflicts.
  • Scalability: You can easily scale your application by deploying multiple containers.
  • Portability: Containers can run on any machine that has Docker installed, making it easy to transfer your application across different environments.
  • Simplified Deployment: Docker enables you to package your application with all its dependencies, simplifying the deployment process.

Prerequisites

Before diving into setting up Docker containers for your Laravel application, ensure you have the following:

  • Docker: Install Docker on your machine. Follow the official Docker installation guide for your operating system.
  • Laravel Application: A Laravel application ready for deployment. You can create a new Laravel app using Composer if needed.

Step-by-Step Guide to Set Up Docker Containers for Laravel

Step 1: Create Dockerfile

The Dockerfile is a text file containing instructions on how to build a Docker image. Create a file named Dockerfile in the root of your Laravel project and add the following content:

# Use the official PHP image with Apache
FROM php:8.0-apache

# Install system dependencies
RUN apt-get update && apt-get install -y \
    libpng-dev \
    libjpeg-dev \
    libfreetype6-dev \
    libzip-dev \
    unzip \
    && docker-php-ext-configure gd --with-freetype --with-jpeg \
    && docker-php-ext-install gd zip

# Enable Apache mod_rewrite
RUN a2enmod rewrite

# Set the working directory
WORKDIR /var/www/html

# Copy the Laravel application
COPY . .

# Install Composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

# Install PHP dependencies
RUN composer install --optimize-autoloader --no-dev

# Set permissions
RUN chown -R www-data:www-data /var/www/html/storage /var/www/html/bootstrap/cache

# Expose port 80
EXPOSE 80

Step 2: Create Docker Compose File

Docker Compose simplifies the management of multi-container applications. Create a file named docker-compose.yml in the root of your project and add the following:

version: '3.8'

services:
  app:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "80:80"
    volumes:
      - .:/var/www/html
    environment:
      APP_ENV: production
      APP_DEBUG: false
      APP_KEY: base64:YOUR_APP_KEY
      DB_CONNECTION: mysql
      DB_HOST: db
      DB_PORT: 3306
      DB_DATABASE: YOUR_DATABASE
      DB_USERNAME: YOUR_USERNAME
      DB_PASSWORD: YOUR_PASSWORD

  db:
    image: mysql:5.7
    restart: always
    environment:
      MYSQL_DATABASE: YOUR_DATABASE
      MYSQL_USER: YOUR_USERNAME
      MYSQL_PASSWORD: YOUR_PASSWORD
      MYSQL_ROOT_PASSWORD: YOUR_ROOT_PASSWORD
    ports:
      - "3306:3306"

Step 3: Build and Run Your Docker Containers

Navigate to your project directory in the terminal and run the following command to build and start your containers:

docker-compose up -d

This command does the following:

  • Builds the application image based on your Dockerfile.
  • Pulls the MySQL image from Docker Hub if it’s not already available locally.
  • Starts the containers in detached mode.

Step 4: Migrate Your Database

Once your containers are running, you need to set up your database. First, access the Laravel container:

docker exec -it your_project_app_1 bash

Then run the migrations:

php artisan migrate

Step 5: Access Your Application

Your application should now be accessible at http://localhost. You can verify the setup by visiting this URL in your web browser.

Troubleshooting Docker Issues

While Docker simplifies deployment, you may encounter some common issues:

  • Permission Denied: Ensure proper permissions for the storage and bootstrap/cache directories.
  • Database Connection Errors: Verify that your database credentials in docker-compose.yml match those in your .env file.
  • Container Not Starting: Check logs using docker-compose logs for any errors.

Conclusion

Setting up Docker containers for a Laravel application in production can significantly enhance your deployment process, providing a robust and scalable environment. By following the steps outlined in this article, you can ensure that your application runs smoothly across different environments with minimal friction. Embrace Docker to streamline your development workflow and take your Laravel applications to the next level!

SR
Syed
Rizwan

About the Author

Syed Rizwan is a Machine Learning Engineer with 5 years of experience in AI, IoT, and Industrial Automation.