Bir Backend Projesini Baştan Sona Dockerize Ettim: DevOps Dünyasına İlk Adımım
Meğer asıl problem yazdığım kodda değil, o kodun çalıştığı yerdeymiş.
Bir Backend Projesini Baştan Sona Dockerize Ettim: DevOps Dünyasına İlk Adımım
Meğer asıl problem yazdığım kodda değil, o kodun çalıştığı yerdeymiş.

Uzun bir süre DevOps dünyasının sadece devasa sistemleri yöneten büyük şirketlerin uğraştığı, karmaşık bir alan olduğunu düşünüyordum. Kubernetes, CI/CD süreçleri, container orkestrasyonu, altyapı yönetimi… Tüm bunların backend geliştirmeyle çok da doğrudan bir bağlantısı olmadığını sanıyordum.
Kesinlikle yanılmışım.
Bir backend projesini baştan sona Dockerize etmeye karar verdiğimde, aslında DevOps’un temelinde çok basit ve hayati bir sorunu çözmeye çalıştığını fark ettim: Yazılan kodun her ortamda birebir aynı şekilde çalışmasını sağlamak.
Dürüst olmak gerekirse, backend geliştirirken başımı en çok ağrıtan problemlerin kaynağı tam olarak buydu. Kendi bilgisayarımda tıkır tıkır çalışan kodun sunucuda patlaması, projeye yeni dahil olan birinin bilgisayarındaki Node.js sürümünün farklı olması, eksik ortam değişkenleri veya bir türlü kurulamayan veritabanı bağlantıları… Tüm bunlar enerjimi kod yazmaktan çok ortam kurmaya harcamama neden oluyordu.
Docker kullanmaya başladıktan sonra, ilk defa geliştirme ve canlıya alma süreçlerini birbirinden bağımsız iki ayrı dünya olarak değil, bir bütün olarak düşünmeye başladım. İşte o noktada DevOps kavramı benim için süslü bir teoriden çıkıp, gerçek bir mühendislik ihtiyacına dönüştü.
Asıl Problem Kod Değil, Ortamdı
Backend geliştirmeye ilk başladığım dönemlerde en büyük mesaimi kod yazmaya değil, o kodu çalıştıracak ortamı hazırlamaya harcıyordum.
Ekip çalışmalarında bu durum tam bir zaman hırsızıydı. Her yeni projede farklı bir Node.js sürümü kurmak, eksik paketlerin peşine düşmek ve veritabanı bağlantı sorunlarıyla boğuşmak standart bir ritüel haline gelmişti. Projeye yeni biri katıldığında sırf ortamı ayağa kaldırmak bazen saatlerimizi alıyordu.
Bir noktadan sonra sorunun kodun kendisinde değil, çalıştığı ortamın tutarsızlığında olduğunu kabullendim. Bu tutarsızlığı ortadan kaldırmak için Docker dünyasına adım attım ve ilk kez bir backend projesini tamamen Dockerize ettim.
Projenin Yapısı ve Hedefim
Üzerinde çalıştığım proje aslında oldukça standart ama kendi içinde bağımlılıkları olan bir yapıydı:
- Node.js ile yazılmış bir backend
- PostgreSQL veritabanı
- Redis cache sistemi
- ve standart bir JWT kimlik doğrulama akışı
Normal şartlarda bu projeyi ayağa kaldırmak için sırasıyla PostgreSQL kurmanız, Redis’i ayrı bir servis olarak yapılandırmanız, ortam değişkenlerini tek tek ayarlamanız ve doğru Node sürümünü sisteminize yüklemeniz gerekirdi.
Benim hedefim ise çok netti: Sadece docker compose up komutunu çalıştırmak ve arkanıza yaslanıp tüm sistemin ayağa kalkmasını izlemek. Aslında farkında olmadan kendi çapımda küçük bir DevOps otomasyonu kurmaya çalışıyordum.
İlk Dockerfile Deneyimi
İşe öncelikle uygulamamın kendisi için basit bir Dockerfile yazarak başladım:

Mantık gayet sadeydi. Bir Node.js imajı al, proje dosyalarını içine kopyala, gerekli paketleri kur ve uygulamayı başlat. Bu ilk container başarıyla ayağa kalktığında hissettiğim o başarma duygusu gerçekten paha biçilemezdi.
Sonra Gerçek Dünyanın Problemleri Başladı
Container çalışıyordu ama eksikler vardı. Veritabanı bağlantısı kurulamıyordu, ortam değişkenleri eksikti, kodda değişiklik yaptığımda anında göremiyordum ve en kötüsü container her yeniden başlatıldığında verilerim buharlaşıyordu.
Tam bu noktada Docker’ın sadece bir kodu izole bir kutuda çalıştırmaktan ibaret olmadığını anladım. İşin içine servisleri birbiriyle konuşturmak, yani orkestrasyon giriyordu. Bu ihtiyaç beni Docker Compose ile tanıştırdı ve tüm mimariyi tek bir dosyadan yönetmeye başladım.

Terminalde komutu çalıştırdığımda backend, veritabanı ve cache sisteminin aynı anda, birbirini tanıyarak ayağa kalktığını görmek büyüleyiciydi. Docker’ın gerçek gücüyle o an tanıştım.
Ve O Klasik Hata: Localhost Tuzağı
Süreç boyunca her şey sorunsuz ilerlemedi elbette. Bir gün container içinde çalışan uygulamam sürekli çökmeye başladı. Saatlerce logları okuyup debug yaptıktan sonra sorunun inanılmaz basit ama bir o kadar da öğretici bir detaydan kaynaklandığını fark ettim: localhost.
Uygulamanın içindeki localhost ifadesinin, benim bilgisayarımı değil, container’ın bizzat kendi iç ağını işaret ettiğini bilmiyordum. Haliyle uygulamam kendi içinde bir veritabanı arıyor ama bulamıyordu. Veritabanı adresini sadece postgres (servis adı) olarak değiştirdiğim an her şey mucizevi bir şekilde düzeldi. Bu küçük kriz, bana Docker’ın ağ yönetimi mantığını yaşayarak öğretmiş oldu.
Bu Süreçten Çıkardığım Dersler
Bu serüvenin sonunda sadece birkaç Docker komutu ezberlemedim, yazılım geliştirme bakış açımı tamamen değiştiren şeyler öğrendim:
1. Çevre bağımlılığı hafife alınacak bir sorun değil Aynı kod bloğunun iki farklı bilgisayarda tamamen farklı tepkiler vermesi bir yazılımcının en büyük kabusudur. Docker bu kabusu neredeyse tamamen ortadan kaldırıyor.
2. Kendi bilgisayarımda çalışıyor yanılgısı Bir kodun sadece sizin makinenizde çalışması aslında büyük bir kırmızı bayraktır. Önemli olan, kodun gideceği son durakta, yani canlı sunucuda nasıl çalışacağıdır.
3. Geliştirme ve canlı ortamı arasındaki uçurum kapanıyor Docker sayesinde kendi bilgisayarımdaki yapı, canlı ortama o kadar yaklaştı ki, sürpriz hatalarla karşılaşma oranım ciddi şekilde düştü. DevOps kültürünün temel amacının bu güveni sağlamak olduğunu şimdi çok daha iyi anlıyorum.
4. Küçük projeler bile Docker’ı hak ediyor Eskiden bu tarz araçların sadece mikroservis mimarisine sahip dev projeler için olduğunu düşünürdüm. Oysa tek bir veritabanı kullanan basit bir API projesinde bile sağladığı hız ve standartlaşma muazzam.
Sonuç
Bu süreç bana, DevOps kavramının sadece sunucularla boğuşan sistem yöneticilerine ait bir iş olmadığını kanıtladı. Sürdürülebilir bir sistem kurmak, süreçleri otomatize etmek ve stabil bir şekilde canlıya çıkabilmek, iyi bir backend geliştiricinin de temel yetkinliklerinden biri olmalı.
Docker benim için bu geniş dünyaya açılan ilk kapı oldu. Artık yeni bir projeye başlarken sadece yazacağım algoritmayı değil; bu kodun nasıl paketleneceğini, farklı ortamlarda nasıl davranacağını ve gelecekte nasıl ölçekleneceğini de en baştan kurgulamaya başlıyorum. Ve inanın bana, bu bakış açısı yazdığınız kodun kalitesini doğrudan etkiliyor.
메타데이터
- post_id
- 4e6e3bb96598
- slug
- bir-backend-projesini-baştan-sona-dockerize-ettim-devops-dünyasına-i̇lk-adımım-4e6e3bb96598
- url
- https://medium.com/@ftmnrakb8585/bir-backend-projesini-ba%C5%9Ftan-sona-dockerize-ettim-devops-d%C3%BCnyas%C4%B1na-i%CC%87lk-ad%C4%B1m%C4%B1m-4e6e3bb96598
- canonical_url
- https://medium.com/@ftmnrakb8585/bir-backend-projesini-ba%C5%9Ftan-sona-dockerize-ettim-devops-d%C3%BCnyas%C4%B1na-i%CC%87lk-ad%C4%B1m%C4%B1m-4e6e3bb96598
- author_url
- https://medium.com/@ftmnrakb8585
- status
- ok
- fetched_at
- 2026-06-09 15:37:30