Setup Laravel Project with Docker Nginx & phpMyadmin

Setup Laravel Project with Docker Nginx & phpMyadmin

Docker provides a tool called Docker Compose for defining the setup process of a docker container. Docker Compose allows developers to define the infrastructure of their application, services, volumes, networks, and any dependencies in one file called the docker-compose file. It can manage multiple Docker containers through its commands such as docker container create, docker container run, etc.

composer create-project laravel/laravel example-app
cd example-app

Creating the Dockerfile & other setup

Next create a .docker folder in root directory

Next create app folder in .docker directory & create new two file Dockerfile , php-fpm.ini

in example-app/.docker/app/Dockerfile

This dockerfile will set the base image and specify the necessary commands and instructions to build the laravel application image. Add the following code to the file:

FROM php:8.0.2-fpm
ARG user
ARG uid
# Install Dependencies
RUN apt-get update && apt-get install -y git curl libpng-dev libonig-dev libxml2-dev zip unzip

#install some base extensions
RUN apt-get install -y \
    libzip-dev \
    zip \
    zlib1g-dev\
    && docker-php-ext-install zip \
    && docker-php-ext-install gd
# Clear Cache
RUN apt-get clean && rm -rf /var/lib/apt/lists/*

# Install PHP extensions
RUN docker-php-ext-install sockets pdo_mysql intl mbstring exif pcntl bcmath gd

#Install Node Js and Npm
RUN curl -sL https://deb.nodesource.com/setup_14.x | bash -

RUN apt-get install -y nodejs
# Get latest Composer
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer

# Create system user to run Composer and Artisan Commands
RUN useradd -G www-data,root -u $uid -d /home/$user $user
RUN mkdir -p /home/$user/.composer && \
    chown -R $user:$user /home/$user

# Set working directory
WORKDIR /var/www
RUN chown -R www-data:www-data /var/www
USER $user

Config PHP

in example-app/.docker/app/php-fpm.ini

date.timezone = UTC

display_errors = Off
log_errors = On

memory_limit = -1
 
max_execution_time = 3000
max_input_time = 600
memory_limit = 512M
post_max_size = 256M
upload_max_filesize = 256M

[opcache]
opcache.enable = 1
opcache.enable_cli = 1
opcache.revalidate_freq = 0
opcache.validate_timestamps = 1
opcache.max_accelerated_files = 25000
opcache.memory_consumption = 192
opcache.max_wasted_percentage = 10
opcache.interned_strings_buffer = 16
opcache.fast_shutdown = 1
realpath_cache_size = 4096K
realpath_cache_ttl = 7200

[xdebug]
xdebug.remote_enable = 1
xdebug.remote_port = 9000
xdebug.remote_autostart = 0
xdebug.remote_connect_back = 0
xdebug.idekey = PHPSTORM

Setup nginx config

create nginx folder in .docker folder & create default.conf file

example-app/.docker/nginx/default.conf


  
server {
    listen 80;
    index index.php index.html;
    error_log  /var/log/nginx/error.log;
    access_log /var/log/nginx/access.log;
    root /var/www/html/public;
    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass app:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
    location / {
        try_files $uri $uri/ /index.php?$query_string;
        gzip_static on;
    }
}

docker-compose Laravel

Creating Docker Compose File

~/example-app/docker-compose.yml

docker-compose file will config app , nginx, phpmyadmin

version: "3.7"
services:
  nginx:
    image: nginx:alpine
    container_name: example-app-nginx
    restart: unless-stopped
    ports:
      - 8000:80
    volumes:
      - ./:/var/www/html:cached
      - ./.docker/nginx:/etc/nginx/conf.d
    networks:
      - example-app-network
    depends_on:
      - app

  app:
    build:
      args:
        user: Ridoy
        uid: 1000
      context: ./.docker/app
      dockerfile: Dockerfile
    image: example-app
    container_name: example-app
    restart: unless-stopped
    ports: 
        - 6001:6001
    working_dir: /var/www/html
    volumes:
      - ./:/var/www/html:cached
      - ./.docker/app/php-fpm.ini:/usr/local/etc/php/conf.d/99-app.ini
    networks:
      - example-app-network
    depends_on:
      - database

  database:
    image: mariadb:10.5.8
    container_name: example-app-mariadb
    restart: unless-stopped
    ports:
      - 3304:3304
    volumes:
      - example-app-volume:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=${DB_PASSWORD}
      - MYSQL_USER=${DB_USERNAME}
      - MYSQL_PASSWORD=${DB_PASSWORD}
      - MYSQL_DATABASE=${DB_DATABASE}
    networks:
      - example-app-network
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    container_name: example-app-phpmyadmin
    restart: unless-stopped
    tty: true
    depends_on:
      - database
    ports:
      - 8088:80
    environment:
      PMA_HOST: database
      MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
      UPLOAD_LIMIT: 300M
    networks:
      - example-app-network
networks:
  example-app-network:
    driver: bridge

volumes:
  example-app-volume:
    driver: local

Setup Environment ENV

DB_CONNECTION=mysql
DB_HOST=database
DB_PORT=3306
DB_DATABASE=example_app
DB_USERNAME=root
DB_PASSWORD=123456

You just need to a single command to start all of the containers, create the volumes, and set up nginx,phpmyadmin and connect the networks

sudo docker-compose up --build
or 
sudo docker-compose up -d --build

when docker build complete visit

visit http://127.0.0.1:8000

docker compose create a database for access phpmyadmin visit

visit http://127.0.0.1:8088
login with your DB_USERNAME & DB_PASSWORD which you set in env  

composer install & npm install

for access bash use container name following command:

sudo docker exec -it example-app bash
then run 
composer install
npm install

Conclusion

I hope this article help you to setup laravel with docker & nginx , phpmyadmin

About Tech Flow Zone

Check Also

Laravel Query Optimization

Laravel Query Optimization

A well-liked PHP framework for creating web apps is called Laravel. Laravel’s robust query builder, …

6 comments

  1. awesome i was searching for this

  2. this is very helpfull artical it’s work for me

  3. After a 2 week struglle you finnaly solved this for me

  4. This almost worked out the first time… I’m able to run phpmyadmin just fine, but my app isn’t working. This should be at 127.0.0.1:8000 ? or 127.0.0.1:8080 ? or just 127.0.0.1
    All are coming up unavailable.

    Any idea on what’s happening with this?

Leave a Reply

Your email address will not be published. Required fields are marked *