Docker kullanımı oldukça yaygınlaştı. Geliştirme ve yayın ortamlarında oldukça geniş kullanım alanları var. Geliştirilen uygulamanın tüm gereksinimlerini bir container (taşıyıcı) içerisinde çalıştırma fikri çok da yeni bir fikir değil. Docker, kolay kullanımı, topluluk desteği, kurumsal iş ortakları konularında oldukça başarılı.
Bu yazımda mümkün olan en temel haliyle PHP içinde gelen yerleşik web sunucusunun bir docker container içerisinde çalıştırılmasına değinmeye çalışacağım.
İhtiyacımız olan tek yazılım Docker. https://www.docker.com/products/docker-desktop sayfasına giderek işletim sisteminize uygun olan versiyonu indirip kurmanız gerekiyor. Kurulum dosyası 700MB civarında. Docker Desktop uygulaması ihtiyacınız olan şeyleri kuracak. Bunun içinde oldukça kullanışlı bir dashboard ve ana yazlımlar docker-cli, docker-api gibi uygulamalar var. Arayüz dışında yapılan işlem image yönetimi, container yönetimi, volume (disk alanı) yönetimi, network yönetimi olarak özetlenebilir.
PHP 5.4.0 versiyonu ve sonrasında yazılım geliştirme işlemlerine yardımcı olması için eklenen bir özellik. Bu sunucu tam bir bilindik web sunucusu özelliklerine sahip değil, uygulamanın yayın versiyonunda kullanması önerilmiyor. Çoklu isteklerde çalışma mantığı gereği oldukça yavaş. Kullanım amacı bulunduğunuz klasörde hızlı bir şekilde istediğiniz port’tan çalışabilen bir web sunucu oluşturması deneysel çalışmalar için süper kullanışlı. Örneği çok basit tutmak için bu yöntemi tercih ettim.
minimal-php
klasörü oluşturup içine aşağıdaki içeriğe sahip olacak index.php isimli bir dosya oluşturalım.
1 2 |
<?php phpinfo(); |
Eğer makinenizde PHP kurulu ise (bu makalede gerekli değil) php -S yazdığınızda kullanılabilecek parametre listesini göreceksiniz. Komutumuzu php -S localhost:9800 şeklinde : formatına uygun olarak çalıştırdığımızda bulunduğumuz klasördeki dosyaları (html, css, js, php), çalıştırdığı klasörü kök kabul edecek ve http://localhost:9800 adresinden sunmaya başlayacak. Artık http istek yapabilen her türlü uygulamadan (web tarayıcı gibi) bu sunucuya ulaşabilirsiniz. Bu web sunucu otomatik olarak index.php veya index.html dosyası ilk olarak göstermeye çalışacak. index.php, index.html dosyaları elbette zorunlu değil, dosyanız farklıysa http://localhost:9800/dosyam.php şeklinde erişebilirsiniz. Daha fazla detaya girmeden devam edelim (Daha fazla bilgi için https://www.php.net/manual/en/features.commandline.webserver.php). index.php içeriğinde phpinfo
fonksiyonu çalışıyor. Bu fonksiyon bize kurulu olan PHP ile ilgili bir çok bilgiler vermekte.
index.php
dosyasından oluşan mükemmel php projemiz hazır. Peki bunu bağımlılıkları daha önceden tanımlanmış, değişik işletim sistemlerinde çalışan bir web uygulaması haline nasıl getireceğiz? Önce dosyamızın içinde olacağı bir image oluşturmamız gerekiyor. Imajı en basit haliyle uygulamamızı ve uygulamamızın çalışması için gerekli yazılımları içeren, kullandığımız işletim sistemindeki yazılımlardan izole bir kutu olarak düşünebiliriz.
minimal-php
klasörümüzün içine Dockerfile
isimli bir dosya yaratıp içeriğine aşağıdaki 5 satırı ekleyin.
1 2 3 4 5 |
FROM php:7.4.1-cli-alpine3.11 RUN mkdir -p /src/app COPY index.php /src/app EXPOSE 3000 CMD ["php", "-S", "0.0.0.0:3000", "-t", "/src/app"] |
minimal-php
klasör içeriği
1 2 3 |
. ├── Dockerfile └── index.php |
İlk kez bir Dockerfile dosyası ile karşılaşıyorsanız bu dosyada yazılanların docker/image/container denen şeylerle ne ilgisi olduğunu sorabilirsiniz. Satırlarımıza bir göz aralım.
FROM php:7.4.1-cli-alpine3.11
satırı yeni oluşturacağımız image’ın hangi image’ı temel alacağını tanımlar. Satırdaki FROM
kısmı yaptıracağız işin ismi, php kullanacağımız image’ı, 7.4.1-cli-alpine3.11
kısmı ise imajın versiyonunu belirtir. Belirtilen image önce komutun çalıştırıldığı makinede aranır yoksa https://hub.docker.com/ reposundan kullanılır.
RUN mkdir -p /src/app
satırı FROM ile belirtilen temel image çekildikten sonra içine girerek /src/app
konumunda bir klasör oluşturur. RUN hazırlanmakta image içinde komut çalıştırır.
COPY index.php /src/app
satırı çalıştırdığımız makinedeki index.php dosyasını, bir üstte oluşturulan imaj içindeki /src/app klasörü içine kopyalar.
EXPOSE 3000
satırı Docker tarafından dinlenecek network portunu belirtir. Biz uygulamamızı 3000 portundan sunacağımız için 3000 yazdık.
CMD ["php", "-S", "0.0.0.0:3000", "-t", "/src/app"]
satırı ilgili satırda PHP Yerleşik Web sunucusunu çalıştırır. 3000 portunu seçmemde özel bir sebep yok. EXPOSE satırındaki port numarasıyla aynı olması yeterli. -t parametresi PHP sunucusunun hangi klasörde çalıştırılacağı belirtir (WORKDIR ile /src/app belirtilirse -t parametresine gerek kalmayacaktı).
Dockerfile içeriğini inceledikten sonra artık image oluşturma işine geçebiliriz. Aşağıdaki komutla bulunduğumuz klasördeki (. bulunduğumuz klasörü temsil ediyor) Dockerfile dosyasındaki yönergeler kullanılarak minimal-php isimli bir image oluşturulur. Bu komuttaki -t minimal-php kısmı isteğe bağlıdır. Rastgele isimli bir imaj oluşturmaktansa isim vererek oluşturmayı tercih ettik.
1 |
docker build -t minimal-php . |
docker images --all
komutu çalıştırıldığında image list görüntülenir
Image oluşturduk, ancak bu muhteşem index.php
yazılımımızı web sunucumuzu çalıştırmak için yeterli değil. docker build ile bir imaj oluşturduk. Bu image henüz bir çalışmıyor.
Mevcut imajımızı bir container içerisinde çalıştırmak için aşağıdaki komutu çalıştırıyoruz.
1 |
docker run --publish 8812:3000 --name minimal-php-container minimal-php |
Buradaki —-publish
(veya -p) seçeneği bir container portunu host portuna yönlendirir. Yani 3000
portunda çalışan PHP Yerleşik Web Sunucusunun çalışan makinedeki hangi porttan ulaşılacağını belirler. 8812
portu herhangi bir port olabilir. —-name
ile container ismi belirtilmesi, sıralamalarda diğerleriyle karıştırılmaması içindir. http://localhost:8812
/ adresine ulaşmak istedinizde oluşturduğumuz image içerisinde kullanılan php ile ilgili bilgilerin yer aldığı sayfayı göreceksiniz. Sayfayı ziyaret ettiğinizde docker run
komutunu çalıştırdığınız terminalde container altında çalışan web sunucusuna yapılan istekleri görebilirsiniz.
docker ps
komutu ile container listesi görüntülenebilir.
https://github.com/mahmutbayri/docker-examples/tree/master/minimal-php adresinde örnekte kullandığım dosyaların son hallerine bakabilirsiniz.