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…