Docker – PHP uygulama ortamı için Docker Compose

Docker Compose, Docker konteyner uygulamalarınızı yönetmek ve birden çok konteyneri bir araya getirmek için kullanılan bir araçtır. Docker Compose, bir YAML dosyasında tanımlanan birden çok servisi ve bu servislerin konfigürasyonlarını içerir. Bu dosya, bir uygulamanın gereksinim duyduğu tüm konteynerleri ve bu konteynerlerin nasıl bir arada çalışacaklarına dair bilgileri içerir.

Dockerfile ise, Docker konteynerlerini oluşturmak için kullanılan bir dosya formatıdır. Dockerfile, bir imaj oluşturmak için adım adım talimatlar içerir. İmaj, bir konteynerin çalıştığı ortamı ve uygulama kodunu içeren bir pakettir.

Docker Compose kullanarak PHP, Apache, MySQL ve phpMyAdmin içeren bir uygulama ortamı oluşturmak için aşağıda örnek bir docker-compose.yml dosyasını bulabilirsin. Bu dosya, bir PHP uygulamasını barındıran Apache sunucusunu, bir MySQL veritabanını ve phpMyAdmin arayüzünü içerir.

version: '3.8'

services:
  # Apache ve PHP servisi
  web:
    image: php:8-apache
    container_name: php-apache-container
    ports:
      - "8080:80"
    volumes:
      - .:/var/www/html

  # MySQL servisi
  mysql:
    image: mysql:8.0
    networks:
      - my-network
    container_name: mysql-container
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: root_password
      MYSQL_DATABASE: your_database
      MYSQL_USER: your_user
      MYSQL_PASSWORD: your_password
    volumes:
      - ./mysql-data:/var/lib/mysql

  # phpMyAdmin servisi
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    networks:
      - my-network
    container_name: phpmyadmin-container
    ports:
      - "8081:80"
    environment:
      PMA_HOST: mysql
      MYSQL_ROOT_PASSWORD: root_password
    depends_on:
      - mysql

# Define networks
networks:
  my-network:

Bu dosya, üç servisi (web, mysql, ve phpmyadmin) tanımlar. Servisler arasında bağlantılar için depends_on kullanılarak, MySQL servisinin başlamasının ardından phpMyAdmin servisinin başlamasını sağlar.

Ayrıca, volumes kullanılarak host makinanın dosya sistemine bağlı iki adet volume eklenmiştir. Bu volume’ler, Apache’nin PHP kodunu barındıracağı klasörü (./) ve MySQL’in veritabanı dosyalarını saklayacağı klasörü (./mysql-data) temsil eder. Bu şekilde, container’lar durduğunda bile verileriniz kaybolmaz.

Docker Compose’un networks bölümü, uygulamanın içindeki konteynerler arasında iletişim kurmalarını sağlayan ağları tanımlar. Bu ağlar, konteynerlerin birbirleriyle iletişim kurmalarına ve belirli servislerin belirli ağlarda çalışmalarına olanak tanır. Bu, özellikle güvenlik veya performans gereksinimlerini karşılamak için farklı ağ segmentlerinde çalışan servisleri izole etmek istediğiniz durumlarda kullanışlıdır.

Aşağıdaki komutla, konfigürasyonlarını tamamladığımız servisleri ayağa kaldırabilirsiniz.

docker-compose up -d

Artık tarayıcınızı açabilir ve http://localhost:8080 adresine giderek PHP uygulamanızı görebilirsiniz. phpMyAdmin arayüzüne http://localhost:8081/ adresinden erişebilirsiniz.

Docker – PHP uygulama ortamı için Dockerfile

Dockerfile, Docker konteynerlerini oluşturmak için kullanılan metin tabanlı bir dosyadır.

Bir Dockerfile, bir uygulamanın konteyner görüntüsünü (Docker Image) nasıl oluşturacağınızı ve yapılandıracağınızı tanımlar. Dockerfile, yapılacak işlemleri adımlar halinde belirler.

Dockerfile, uygulamanızın bağımlılıklarını, eklentilerini, ortam değişkenlerini ve sırasıyla çalıştırılacak komutları tanımlamanıza olanak tanır.

Dockerfile ile üç adımda konteyner çalıştırılabilir:

  1. Önce Dockerfile oluşturulur.
  2. Hazırlanan Dockerfile ile Docker Image build edilir.
  3. Docker Image çalıştırılarak Docker Container run edilir.

Örneğin, basit bir PHP ortamı için Dockerfile kullanarak bir Docker Image oluşturalım:

# Resmi PHP imajını kullan
FROM php:8.2-apache

# Gerekli PHP eklentilerini yükle
RUN docker-php-ext-install mysqli pdo pdo_mysql

# Apache'i etkinleştir
RUN a2enmod rewrite

# Çalışma dizini ayarla
WORKDIR /var/www/html

# Proje kodunu konteynere kopyala
COPY . /var/www/html

Hazırladığımız Dockerfile ile konteyner görüntüsünü (Docker Image) oluşturmak için aşağıdaki satırı Dockerfile’ın bulunduğu dizinde terminal aracılığıyla çalıştırın:

 docker build -t my_php_image .

my_php_image ismiyle bir konteyner görüntüsü (Docker Image) oluşturduk. Aşağıdaki komut ile, oluşturulan tüm imajları listeleyebilirsiniz:

 docker images

Hazırladığımız Docker Image üzerinden my_php_container ismini verdiğimiz konteynerimizi başlatabiliriz:

docker run -d -p 8080:80 --name my_php_container my_php_image

Tarayıcıdan http://localhost:8080/ adresine giderek index.php dosyasını görüntüleyebilirsiniz. Bu arada, Port Mapping işlemi ile apache default portunu (80), 8080 portuna yönlendirdik.

Docker Container İçerisinde Geliştirme (Mount Volumes)

Live code reloading özelliğini etkinleştirmek ve değişikliklerinizi konteynerin dışında sürdürmek için local bir dizini konteynere monte ederek kod değişikliklerinizi konteynerin içinde hemen görünür hale getirebilirsiniz. -v local_dizin:/var/www/html

docker run -d -p 8080:80 -v .:/var/www/html --name my_php_container my_php_image

Temizlik

Geliştirme çalışmanız bittiğinde, konteyneri durdurabilir ve kaldırabilirsiniz.

docker stop my_php_container
docker rm my_php_container

Artık ihtiyacınız yoksa Docker Image’i de kaldırabilirsiniz

docker rmi my_php_image