3 min read

Docker ile PHP Çalışma Ortamı Oluşturma

Uzun zamandır bloguma yeni bir içerik girmek istiyordum fakat bunun için ne bir zaman ne de bir konu bulabildim. Bugünlerde yeni bir proje geliştirmek için çalışma ortamımdaki “docker” için yeni bir imaj oluştururken bu konu hakkında bir şeyler yazabileceğimi düşündüm. Evet şu anda bu konu hakkında bir şeyler karalıyorum buraya…

Docker’ın ne olduğunu, nasıl çalıştığı kısmına hiç girmeyip sizleri google’ın sonsuz denizlerine bırakıyorum… Bu yazımızda sadece docker kullanarak nasıl bir çalışma ortamı hazırlayabileceğimizi uygulamalı bir şekilde anlatmaya çalışacağım.

Bu yazıyı hazırlarken Mac OS üzerinde testlerimi yapıyor olacağım. İşletim sisteminizin farklılık göstermesi sonucunda oluşabilecek farklı senaryoları benimle paylaşabilirseniz bir çözüm üretmek için elimden geleni yapabilirim.

Öncelikle ihtiyaçlarımızı belirleyelim. Ben bu örnekte Nginx web sunucusunun üzerinde çalışacak bir PHP application için çalışma ortamı hazırlamak istiyorum. Bu nedenle bana gerekli olanlar sırasıyla;

  1. Nginx Web Server
  2. PHP-FPM

İhtiyaç listemizi hazırladık. Bunları temin etme vakti! İlgili paketleri bulabileceğimiz adres: https://store.docker.com. Bunun yanı sıra docker imajlarını bir paket haline getirip her seferinde konsolda aynı işleri yapmak yerine “docker-compose” tool’unu kullanacağım.

Dizinimizi ve “docker-compose.yml” dosyasımızı oluşturalım.

mkdir php-app
cd php-app
mkdir www logs
touch docker-compose.yml

docker-compose.yml dosyamızı açıp nginx için gerekli eklemeleri yapalım.

version: '2'
services:
  web-server:
    image: nginx:latest
    ports:
      - 80:80 # => Web server'a ait 80 portu dışarıya 80 portundan aktarıldı. 
    volumes:
      - ./www:/usr/share/nginx/html # => Nginx çalışma dizini klasörümüzde bulunan "www" diziniyle ilişkilendirildi.
      - ./www.conf:/etc/nginx/conf.d/default.conf # => Nginx config dosyası, projemizde bulunan config dosyası olarak tanımlandı.
      - ./logs:/var/log/nginx # => Nginx log dizini, projemizin log dizini olarak ilişkilendirildi.

Nginx web sunucumuz için configlerini ayarlayalım.

server {
    listen       80;
    server_name  localhost;
    root         /usr/share/nginx/html;

    location / {
        index  index.html index.htm;
    }
    error_page   500 502 503 504  /50x.html;
}

Yukarıda paylaştığım default bir nginx config dosyası. root olarak tanımlanan dizine atılan herhangi bir html dosyası 80 portu üzerinden serve edilebilecek şekilde hazırlanmış.

Yaptığımız çalışmayı görme vakti… Aşağıdaki komutu çalıştırarak ilgili docker paketlerini indirip çalıştalım.

docker-compose up -d

-d argümanı, “Detached mode” olarak tanımlanmaktadır. Yani konteynırlar arka planda çalışacaklar.

Bir sorunla karşılaşmadan komutumuz çalıştıysa tarayıcımıza gelip localhost yazıp ilgili html dosyamızı görebiliriz. (Bunun için öncelikle www klasörünüze bir html dosyası oluşturmanız gerekmektedir.)

Şimdi sıra geldi PHP için gerekli düzenlemelerin yapılmasına. PHP için php-fpm imajını kullanacağız. docker-compose.yml dosyamızı açalım ve aşağıdaki eklemelerle birlikte dosyamızın son halini görelim.

version: '2'
services:
  web-server:
    image: nginx:latest
    ports:
      - 80:80
    volumes:
      - ./www:/usr/share/nginx/html
      - ./www.conf:/etc/nginx/conf.d/default.conf
      - ./logs:/var/log/nginx
    links: 
       - php #=> Web sunucumuzun PHP imajıyla konuşabilmesi için iki servis ilişkilendirildi.
  php: #=> PHP isimli bir servis oluşturduk. 
    image: php:7.1-fpm #=> php 7.1 fpm iamajı kullanıldı.
    volumes: # => www klasörümüz, PHP-FPM default yolu ile ilişkilendirildi.
      - ./www:/var/www/html

Ardından Nginx config dosyamızı açıp aşağıdaki şekilde düzenleyelim.

server {
    listen       80;
    server_name  localhost;
    root         /usr/share/nginx/html;

     location / {
         index  index.html index.htm;
     }
    error_page   500 502 503 504  /50x.html;

    location ~ \.php$ {
        fastcgi_pass   php:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  /var/www/html$fastcgi_script_name;
        include        fastcgi_params;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
}

Nginx config içerisine FPM için ilgili düzenlemeler eklenmiş oldu böylelikle.

PHP-FPM imajı da docker-compose.yml dosyamıza ekledikten sonra konsala gelip aşağıdaki komut ile docker imajlarımızı yeniden başlatalım.

docker-compose restart

Bir sorun oluşmadıysa, www klasörümüze gelip bir index.php dosyası oluşturalım. İçerisine de aşağıdaki kodları girelim.

<?php

phpinfo();

Ardından http://localhost/index.php adresine giderek PHP info çıktısını görebiliriz.

Bu çalışma ile docker kullanarak bir çalışma ortamı nasıl kurulur örneklemiş olduk. Dilerseniz mevcut hazır paketleri kullanabilirsiniz veya kendiniz bir imaj build edebilirsiniz. Bu yazımızda offical paketler ile bir çalışma ortamı kurulmuş oldu.

Başka bir yazıda görüşmek üzere 🙂