Docker
Laravel Nasıl Dockerize Edilir ?

Laravel projenizi docker ile run etmek istediğinizde iki temel dosyaya ve projenizin gereksinimlerini belirlemeye ihtiyacınız olacak.
Proje gereksinimleri nasıl belirlenir ?
Projenizde
- Kullanılan veritabanı
- Kullanılan magic methodlar (bazı sunucularda bazı fonnksiyonlar güvenlik nedeniyle kapalı olabildğinden bunları belirtmeniz gerekebilir)
- Kullanılan Cache tooları
- Kullanılan Job tracking toolları
- vb
Burada ihtiyacınız olan temel şeylerin listesi mevcut ancak burası projeye göre değişiklik gösterecektir.
Ben şimdi veritabanı postgresql olan nginx üzerinden yayın yapcak, cache için redis kullanacak bir proje için dockerfile ve docker compose yaml dosyalarını bırakacağım.
Docker File :
FROM php:8.2.1-fpm
# Set working directory
WORKDIR /var/www
# Add docker php ext repo
ADD https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions /usr/local/bin/
# Install php extensions
RUN chmod +x /usr/local/bin/install-php-extensions && sync && \
install-php-extensions mbstring pdo_mysql pdo_pgsql pgsql zip exif pcntl gd memcached mongodb redis
# Install dependencies
RUN apt-get update && apt-get install -y \
build-essential \
libpng-dev \
libjpeg62-turbo-dev \
libfreetype6-dev \
locales \
zip \
jpegoptim optipng pngquant gifsicle \
unzip \
git \
curl \
lua-zlib-dev \
libmemcached-dev
#RUN pecl install xdebug \
# && docker-php-ext-enable xdebug
#COPY /docker/php/xdebug.ini "${PHP_INI_DIR}/conf.d"
# Install supervisor
RUN apt-get install -y supervisor
# Install composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
# Clear cache
RUN apt-get clean && rm -rf /var/lib/apt/lists/*
# Add user for laravel application
RUN groupadd -g 1000 www
RUN useradd -u 1000 -ms /bin/bash -g www www
# Copy code to /var/www
COPY --chown=www:www-data . /var/www
RUN touch /var/www/storage/logs/laravel.log
RUN chmod -R 777 /var/www/storage/
RUN chmod -R 777 /var/www/bootstrap/cache/
# add root to www group
RUN chmod -R ug+w /var/www/storage
# Copy nginx/php/supervisor configs
RUN cp docker/supervisor.conf /etc/supervisord.conf
RUN cp docker/php/php.ini /usr/local/etc/php/conf.d/app.ini
#RUN cp docker/nginx/default.conf /etc/nginx/sites-enabled/default
RUN cp docker/php/php-fpm.conf /usr/local/etc/php-fpm.d/www.conf
#RUN cp docker/php/xdebug.ini /usr/local/etc/php/conf.d/xdebug.ini
RUN cp docker/php/error_reporting.ini /usr/local/etc/php/conf.d/error_reporting.ini
# PHP Error Log Files
RUN mkdir /var/log/php
RUN touch /var/log/php/errors.log && chmod 777 /var/log/php/errors.log
# Deployment steps
RUN cp -rf .env.docker .env
RUN composer install --optimize-autoloader
RUN chmod +x deploy-run.sh
ENTRYPOINT ["sh","deploy-run.sh"]
docker-compose.yaml :
networks:
app:
driver: bridge
services:
redis-srv:
container_name: redis-srv
hostname: redis-srv
image: 'redis'
command: redis-server --save 20 1 --loglevel warning --requirepass password123
ports:
- '6379:6379'
volumes:
- './docker/data/redis_data:/data'
networks:
- app
nginx:
image: nginx:latest
container_name: nginx
restart: unless-stopped
tty: true
ports:
- "80:80"
volumes:
- ./:/var/www/
- ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
depends_on:
- api
networks:
- app
api:
build:
context: ./
dockerfile: Dockerfile
container_name: api
hostname: api
extra_hosts:
- "host.docker.internal:host-gateway"
volumes:
- ./:/var/www/
networks:
- app
pgsql-srv:
container_name: pgsql-srv
image: postgres:14.7
environment:
POSTGRES_HOST_AUTH_METHOD: trust
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
POSTGRES_DB: postgres
volumes:
- ./docker/postgres_data:/var/lib/postgresql/data
ports:
- "5432:5432"
restart: always
networks:
- app
Docker filda Entrypoint'te bahsettiğimiz deploy-run.sh :
#!/bin/bash
cd /var/www
#php artisan optimize:clear
php artisan optimize
php artisan view:cache
php artisan migrate
#php artisan db:seed
php artisan storage:link
/usr/bin/supervisord -c /etc/supervisord.conf
Eğer windows makinelerde docker compose up -d dediğinizde run sh ile ilgili bir hata alırsanız deploy-run.sh dosyasındaki bin/bash kısmını bin/sh olarak güncellemelisiniz.