İhtiyacımıza göre Docker ortamımızı oluşturalım

Standard

Selam herkese, eminim bir çoğunuz ihtiyacınıza göre farklı farklı imajları ayağa kaldırıp birbiri ile bağlıyor veya hazır container ları kullanmaktadır. Ancak bugün kendimize kendi imajımızı oluşturmayı çok detaya girmeden anlatacağım sizlere.

Örneğin benim bir projem var ve bu projede özel ihtiyaçlarım var ve ekip arkadaşlarımın geliştirme ortamını kolayca ayağa kaldırmalarını istiyorum. Bu sebeple kendimize bir container oluşturacağız.

İşin sonucunda PHP 8, Nginx, mysql, redis ve clickhouse barındıran bir adet container elde edeceğiz. Bunun yanı sıra spesifik ihtiyacımız olan eklentiyi de ekleyip aktif edeceğiz.

Bir klasör oluşturun ve içinde ilk olarak laravel 8 kodlarını dizin altında src olacak şekilde çekin

git clone https://github.com/laravel/laravel.git src

src dizini oluştu. Dockerfile ve yaml ayar dosyalarımızı oluşturup gerekli dizinleri de oluşturalım. Dizinimizin görüntüsü şu şekilde olmalı:

Aynı zamanda klasörlerin alt klasörleri de aşağıda yazdığı gibi olmalı.

nginx/conf
mysql/data
redis/data
clickhouse/data

Sonra kendimize PHP 8 imajı oluşturalım

docker run php:8.0.3-fpm php -m

İşlem sonucunda size kurulan modüller aşağıdaki gibi listelenecektir.

Status: Downloaded newer image for php:8.0.3-fpm
[PHP Modules]
Core
ctype
curl
date
dom
fileinfo
filter
ftp
hash
iconv
json
libxml
mbstring
mysqlnd
openssl
pcre
PDO
pdo_sqlite
Phar
posix
readline
Reflection
session
SimpleXML
sodium
SPL
sqlite3
standard
tokenizer
xml
xmlreader
xmlwriter
zlib

Sırada docker-compose.yaml dosyası oluşturmak var, içeriği şu şekilde olmalı:

version: "3.7"
networks:
    app-network:
        driver: bridge

services:
    app:
        build: 
            context: ./
            dockerfile: Dockerfile
        image: laravel8-php-fpm-80
        container_name: app
        restart: unless-stopped
        tty: true
        working_dir: /var/www
        volumes: 
            - ./src:/var/www
        networks: 
            - app-network
    
    mysql:
        image: mysql:5.7.33
        container_name: mysql
        restart: unless-stopped
        tty: true
        environment: 
            MYSQL_DATABASE: laravel8
            MYSQL_ROOT_PASSWORD: 123456
            MYSQL_PASSWORD: 123456
            MYSQL_USER: laravel8
            SERVICE_TAGS: dev
            SERVICE_NAME: mysql
        volumes: 
            - ./mysql/data:/var/lib/mysql
        networks:
            - app-network
    
    nginx:
        image: nginx:1.19.8-alpine
        container_name: nginx
        restart: unless-stopped
        tty: true
        ports: 
            - 8100:80
        volumes: 
            - ./src:/var/www
            - ./nginx/conf:/etc/nginx/conf.d
        networks: 
            - app-network
    
    redis:
        image: redis:6.2.1-buster
        container_name: redis
        restart: unless-stopped
        tty: true
        volumes: 
            - ./redis/data:/data
        networks: 
            - app-network

    ch_server:
        container_name: clickhouse-server
        image: yandex/clickhouse-server
        ports:
            - 8123:8123
        volumes:
            - ./clickhouse/data:/var/lib/clickhouse
        networks:
            - app-network
    
    ch_client:
        image: yandex/clickhouse-client
        entrypoint:
            - /bin/sleep
        command:
            - infinity
        networks:
            - app-network

Daha sonra Dockerfile dosyasını oluşturalım dizinimize

FROM php:8.0.3-fpm-buster

RUN docker-php-ext-install bcmath pdo_mysql

RUN pecl install trader && docker-php-ext-enable trader
RUN pecl install redis && docker-php-ext-enable redis

RUN apt-get update
RUN apt-get install -y git zip unzip

COPY --from=composer:latest /usr/bin/composer /usr/bin/composer

EXPOSE 9000

Daha sonra nginx ayarımızı nginx/conf/app.conf dosyasına yazalım

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/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;
    }
}

Artık tüm ayarlarımız bitti ve ayağa kaldırması kaldı.

sudo docker-compose up -d
docker-compose exec -T app composer install
docker-compose exec -T app cp .env.example .env
docker-compose exec -T app php artisan key:generate
docker-compose exec -T app php artisan config:clear
docker-compose exec -T app php artisan migrate
docker-compose exec -T app composer require predis/predis
docker-compose exec -T app composer require the-tinderbox/clickhouse-builder

Eğer .env dosyanızda veri tabanı ayarlarınızı, redis ayarlarını vs. düzgün yaptıysanız container imajları ile birlikte ayağa kalkacaktır.

Redis kurulumu yaptıktan sonra .env içinde şu şekilde olması gerektiğini unutmayınız:

CACHE_DRIVER=redis
REDIS_HOST=redis
REDIS_CLIENT=predis

Redis ayarlarımız düzgün olup olmadığını direk routes/web.php üzerinde test edebiliriz.

use Illuminate\Support\Facades\Redis;

Route::get('/store', function() {
    Redis::set('isim', 'onur');
});

Route::get('/retrieve', function() {
    return Redis::get('isim');
});

Clickhouse sunucusuna bağlanmak istersek eğer aşağıdaki kodu yazarak erişebilirsiniz. Sonucu da çıktı daki gibi olmalı.

Bu arada the-tinderbox/clickhouse-builder paketini kurmak yerine direk clickhouse üzerinde tutacaksanız verilerinizi, .env üzerinde mysql portu olarak 9004 yazıp mysql connection ile bağlanabilirsiniz. Clickhouse 9004 portunu mysql için açmaktadır. (Port ayarı için /etc/clickhouse-server/config.xml bakabilirsiniz)

Ancak mysql ile birlikte clickhouse da kullanmak ve Clickhouse Query Builder paketinden faydalanmak isterseniz şu şekilde bağlanabilirsiniz:

$server = new Tinderbox\Clickhouse\Server('clickhouse-server', '8123', 'onur', 'default', '');
$serverProvider = (new Tinderbox\Clickhouse\ServerProvider())->addServer($server);

$client = new Tinderbox\Clickhouse\Client($serverProvider);
$builder = new Tinderbox\ClickhouseBuilder\Query\Builder($client);

Artık projemiz 8100 portu üzerinden çalışabilir.

Evet bir yazımızın daha sonuna geldik; “Anlayana sivri sinek saz, anlamayana davul zurna az” mantığı ile yeterli olmuştur diye düşünerek yazımı burada noktalıyorum.

Faydalı olmasını ümit ederim…

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir