Docker İle Web Geliştirme Ortamı

Gelişen web dünyası ile birlikte geliştiriciler için birden fazla dil ile ilgilenmek nerde ise zorunluluk olmuş durumda. Bu da yetmezmiş gibi dillerin kullandığı çatılar, geliştirme için kullanılan araçlar derken zibilyar tane zımbırtının kurulması, hatta projelere göre farklı versiyonların kullanılması gibi seçenekleri de beraberinde getirmiştir. Bu araçların kurulması kaldırılması versiyon farklılıklarının yönetilmesi bazen tam bir işkence halini alabiliyor.

Bu boğuşmaların ortasında Docker’in varlığından geçte olsa haberim oldu. Docker İzmir ekibinin düzenlemiş olduğu etkinlikten sonra kurcuklamaya başladığım docker ile birlikte geliştirme ortamını daha verimli hale getirdiğini düşündüğüm bir yapı oluşturabildim.

Docker nedir? Nasıl Kurulur? Container ne? Image ne? gibi soruların cevapları için internetteki kaynaklardan faydalanıp kurduğunuzu varsayarak devam edeceğim. (Gökhan Şengün’ün Bloğu bu konu için az bulunur bir kaynak)

Port Çakışmaları

İlk karşılaştığım sorunlardan bir tanesi idi. Webpack ile bir servis ayağa kaldırdığınızda 2. bir servis için portları kurcuklamak gerekliliği oluşması aşılması zor bir durum olmasa da bunun için zaman ayırmak sinir bozucu. Bunu çözmek için ngnix-proxsy kullandım. Aşağıdaki komut ile 80 portu dinleyen bir container oluşturmakla işe başlıyoruz.

docker run -d -p 80:80 — restart always -v /var/run/docker.sock:/tmp/docker.sock:ro jwilder/nginx-proxy

Bu containerimizin yaptığı iş şu : 
Ayağa kaldırdığınız containerlerde -e VIRTUAL_HOST= …….. gibi bir tanımlamanız varsa (docker-compose içinde de environment:
 — VIRTUAL_HOST=….) docker servisi dinleyerek kendi içinde bir config oluşturuyor ve otomatik olarak virtual_hostunu ayarlamış oluyorsunuz. VIRTUAL_HOST=sdablog.localhost tanımlamışsanız http://sdablog.localhost ile ayağa kalkan servisinize erişebiliyorsunuz.

Ben kendi bilgisayarımda geliştirme yaparken takmaad.localhost şeklinde belirliyorum domainlerimi böylece ek bir ayarla boğuşmuyorum. Tavsiye ederim
docker-compose ile ayağa kaldırdığınız containlerin kendine ait bir network oluşturması gibi bir durum var. Böyle olduğunda nginx containeri o container(ler)e erişemeyebiliyor onun için docker-compose.yml dosyanızdaki bütün servislere network_mode: bridge ekleyerek çözebilirsiniz (Hakan Özler’e Teşekkürler)

Geliştirme Ortamı:

docker-compose ile oluşturduğum örnek bir compose dosyasını aşağıda paylaşıyorum :

version: '2'

services:
db:
image: mysql
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: ${MYSQL_DATABASE}
MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
network_mode: bridge

php:
image:php:7.1-apache
links:
- db:mysqldb
network_mode: bridge
volumes:
- ./:/var/www/html
environment:
- VIRTUAL_HOST=sdablog.localhost

docker-compose up dediğimizde servislerimiz ayağa kalktığında virtualhostta tanımladığımız domainden erişim mümkün oluyor. 
Denemedim ama birden fazla php versiyonu ayağa kaldırıp onların testlerini de yapmak mümkün olur zannediyorum.

volumes: ./:/var/www/html ile çalıştığımız klasörü containerin html klasörüne bağlamış oluyoruz. Böylece kendi alanımızda çalışırken containerden sonuçlarını görmek mümkün oluyor.

Bir diğer avantajı da geliştirme ortamınızı diğer arkadaşlarınızla hızlıca paylaşabiliyor olmanız. Projenin içindeki docker-compose.yml dosyası marifeti ile docker kurmuş çalışma arkadaşınız çok hızlı bir şekilde sizinle aynı geliştirme ortamına sahip oluyor. “sende o mu kurulu” “bende bunun bu versiyonu var” gibi veeee “ya bende çalışiyu sende niye çalışmiyu” gibi serzenişlerin de bir son bulmasına yardımcı olacak bir araç.

One clap, two clap, three clap, forty?

By clapping more or less, you can signal to us which stories really stand out.