Laravel

 

Laravel Deployment with Docker: Containerizing Your App

In the ever-evolving world of web development, deploying applications has become an essential aspect of ensuring a seamless user experience. Traditional deployment methods often involve complex setups, varying server configurations, and potential compatibility issues. This is where containerization, specifically using Docker, comes to the rescue. Docker allows you to package your application, along with its dependencies and environment, into a single unit called a container. In this guide, we’ll walk you through the process of deploying your Laravel application using Docker containers, offering you enhanced portability, scalability, and consistency.

Laravel Deployment with Docker: Containerizing Your App

1. Why Choose Docker for Laravel Deployment?

Docker has gained immense popularity in the software development and deployment landscape due to its numerous advantages:

  • Isolation: Docker containers provide a self-contained environment for your application, isolating it from the underlying system and other containers. This eliminates conflicts and ensures consistent behavior across different environments.
  • Portability: A Docker container bundles your application, runtime, libraries, and dependencies. This portable package can run on any system that supports Docker, regardless of its underlying configuration.
  • Consistency: Docker ensures that your application runs the same way in development, testing, and production environments. This consistency reduces the chances of bugs and errors caused by environment-specific differences.
  • Scalability: Docker containers can be easily scaled up or down based on demand. This flexibility allows your Laravel application to handle increased traffic without major overhauls.
  • Efficiency: Docker’s lightweight nature enables efficient utilization of system resources, leading to faster deployment times and optimized performance.

Now that we understand the benefits of Docker for Laravel deployment, let’s dive into the steps of containerizing your app.

2. Prerequisites

Before you proceed with containerizing your Laravel app, make sure you have the following prerequisites in place:

  • Docker: Install Docker on your development machine. You can download the appropriate version for your operating system from the official Docker website.
  • Laravel Application: Have a functional Laravel application ready for deployment. If you don’t have one yet, you can quickly set up a new Laravel project using Composer with the command:
bash
composer create-project --prefer-dist laravel/laravel my-laravel-app

Step 1: Dockerizing Laravel Application

Create a new file in your Laravel project directory named Dockerfile. This file will contain instructions for building the Docker image of your application.

Open the Dockerfile in a text editor and add the following content:

Dockerfile
# Use the official PHP-FPM image as the base image
FROM php:8.0-fpm

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

# Install system dependencies
RUN apt-get update && apt-get install -y \
    git \
    unzip

# Install PHP extensions
RUN docker-php-ext-install pdo pdo_mysql

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

# Copy Laravel files to the container
COPY . .

# Install application dependencies
RUN composer install

# Expose port 9000 to the host
EXPOSE 9000

# Start PHP-FPM server
CMD ["php-fpm"]

This Dockerfile uses the official PHP-FPM image as its base and adds necessary dependencies, installs Composer, copies your Laravel files into the container, installs application dependencies, exposes port 9000, and starts the PHP-FPM server.

Save the Dockerfile.

Step 2: Building the Docker Image

1. Open a terminal and navigate to your Laravel project directory where the Dockerfile is located.

2. Build the Docker image using the following command:

bash
docker build -t my-laravel-app .

3. Replace my-laravel-app with a suitable name for your Docker image.

4. Once the image is built, you can verify its presence by running:

bash
docker images

Step 3: Running the Laravel Application in a Container

1. With the Docker image ready, you can now run your Laravel application in a Docker container using the following command:

bash
docker run -d -p 8000:9000 my-laravel-app

This command starts a container based on the my-laravel-app image, mapping port 9000 within the container to port 8000 on your host machine.

2. Open your web browser and navigate to http://localhost:8000 to access your Laravel application running inside the Docker container.

Step 4: Database Configuration

1. To connect your Laravel application with a database, you’ll need to configure the database settings. Update your .env file within the Laravel project directory with the appropriate database credentials.

2. When using Docker, it’s recommended to define a separate Docker network to allow communication between containers. Create a Docker network using the command:

bash
docker network create my-laravel-network

3. Start a database container within the same network:

bash
docker run -d --network=my-laravel-network --name=my-laravel-db \
-e MYSQL_ROOT_PASSWORD=yourpassword -e MYSQL_DATABASE=laravel_db \
Mysql:8.0

Replace yourpassword with your desired MySQL root password.

4. Update your Laravel .env file with the following database settings:

env
DB_CONNECTION=mysql
DB_HOST=my-laravel-db
DB_PORT=3306
DB_DATABASE=laravel_db
DB_USERNAME=root
DB_PASSWORD=yourpassword

Step 5: Docker Compose for Simplified Management

While the previous steps provide a basic setup for Dockerized Laravel deployment, using Docker Compose can streamline your deployment process further.

1. Create a new file named docker-compose.yml in your Laravel project directory.

2. Add the following content to the docker-compose.yml file:

yaml
version: '3'
services:
  app:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "8000:9000"
    networks:
      - my-laravel-network
  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: yourpassword
      MYSQL_DATABASE: laravel_db
    networks:
      - my-laravel-network
networks:
  My-laravel-network:

This docker-compose.yml file defines two services: app for your Laravel application and db for the MySQL database. It specifies the Dockerfile to build the app service, exposes port 8000 for the Laravel application, and connects both services to the my-laravel-network network.

3. Run your Laravel application and database containers using Docker Compose:

bash
docker-compose up -d

Conclusion

By following the steps outlined in this guide, you’ve successfully containerized your Laravel application using Docker. This approach offers enhanced portability, scalability, and consistency, making deployment across different environments a breeze. Docker’s isolation and efficiency, combined with Laravel’s powerful features, create a robust foundation for building and deploying modern web applications. As you continue to refine your application, remember that Docker and containerization provide you with the tools to ensure a seamless and reliable user experience. Happy coding and deploying!

Previously at
Flag Argentina
Argentina
time icon
GMT-3
Experienced Full Stack Engineer with expertise in Laravel and AWS. 7 years of hands-on Laravel development, leading impactful projects and teams.