Dockerize Laravel App for Production

deploying laravel app using docker on production server#

As we have already created a development version of laravel using docker now we will create a production version. most of the things will be same so m not going to repeat all those things again. if you do not know how to create docker file for development read this blog post.

Laravel using docker for development

In the preview post we have used php:8.0-fpm for development version and for running it we have used laravels php artisan serve command which start server on port 8000.

running using php cli is not that performant instead we can use mod_php for apache or php-fpm using nginx.

Whenever there is web server attached then multiple request getting hangled by the web server it self, and web server can launch multple php process to handle multiple request.

That’s why it is necessary to use web server for your project in production. i am going to use php:8.0-apache docker image for deploying php.

for that we also have to set document root and enable some modules like a2enmod rewrite

Our docker file will look like this

Dockerfile

FROM php:8.0-apache
WORKDIR /var/www/html
ENV APACHE_DOCUMENT_ROOT=/var/www/html/public
RUN sed -ri -e 's!/var/www/html!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/sites-available/*.conf
RUN sed -ri -e 's!/var/www/html!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/apache2.conf /etc/apache2/conf-available/*.conf
RUN apt-get update && apt-get install -y  \
    libfreetype6-dev \
    libjpeg-dev \
    libpng-dev \
    libwebp-dev \
    libzip-dev \
    --no-install-recommends \
    && docker-php-ext-configure gd --with-freetype --with-jpeg \
    && docker-php-ext-install pdo_mysql -j$(nproc) gd zip 
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
EXPOSE 80

As you know in previous post we have created a post build.sh script which is for post commnads after all the services started then that will execute.

docker-compose.yaml

version: '3'
services:  
  app:
    build:
      context: ./
    volumes:
      # - ./src:/src
      - ./src:/var/www/html
 
    command: bash -c "sh build.sh"

    ports:
      - "8000:80"


As you can see we have only changed the volume section from ./src to ./var/www/html

In your build.sh file add command to enable mode rewrite and to start the apache server


composer install
a2enmod rewrite
exec docker-php-entrypoint apache2-foreground

That’s it this post if you have any doubt you can comment.

comments powered by Disqus