Docker Nedir? Docker Compose ile İlk Projenizi Adım Adım Çalıştırın
23 Ekim 2026Boran BAR
"Benim bilgisayarımda çalışıyordu" cümlesini her yazılımcı en az bir kez kurmuştur. Docker tam olarak bu sorunu çözmek için var: uygulamanızı, ihtiyaç duyduğu bütün bağımlılıklarla birlikte tek bir paket hâline getirir ve bu paket nerede çalıştırılırsa çalıştırılsın aynı şekilde davranır. Bu yazımızda Docker'ın ne olduğunu, temel kavramlarını ve en çok kullanılan komutlarını anlatıyor, ardından Docker Compose ile bir uygulamayı veritabanıyla birlikte adım adım ayağa kaldırıyoruz.
Docker nedir?
Docker, uygulamaları container (konteyner) adı verilen yalıtılmış ortamlarda paketleyip çalıştırmanızı sağlayan açık kaynaklı bir platformdur. Bir container; uygulamanızın kodunu, çalışma zamanını (Node.js, PHP, Python vb.), sistem kütüphanelerini ve ayarlarını bir arada taşır. Böylece geliştirme bilgisayarınızda, test sunucusunda ve canlı sunucuda aynı ortam çalışır.
Container'lar sunucunun işletim sistemi çekirdeğini ortak kullanır; her biri için ayrı bir işletim sistemi başlatılmaz. Bu yüzden saniyeler içinde açılır, az kaynak tüketir ve aynı sunucuda birbirini etkilemeden yan yana çalışır. Örneğin bir projeniz PHP 8.1, diğeri PHP 8.4 istiyorsa ikisini aynı sunucuda ayrı container'larda sorunsuzca çalıştırabilirsiniz.
Container ile sanal makine arasındaki fark
Docker çoğu zaman sanal makineyle karıştırılır. İkisi de yalıtım sağlar, ancak bunu farklı katmanlarda yapar:
Ölçüt | Container (Docker) | Sanal makine |
|---|---|---|
Yalıtım katmanı | İşletim sistemi süreçleri; çekirdek ortak | Donanım sanallaştırma; her makinenin kendi çekirdeği |
Açılış süresi | Saniyeler | Dakikalar |
Boyut | Genellikle onlarca–yüzlerce MB | Genellikle birkaç GB |
Kaynak kullanımı | Düşük; yalnızca uygulamanın ihtiyacı kadar | Her makine için ayrı işletim sistemi yükü |
Tipik kullanım | Uygulama ve servisleri paketlemek | Tam bir sunucu ortamı sağlamak |
İkisi birbirinin rakibi değildir; pratikte çoğu zaman birlikte kullanılır. Docker'ı genellikle bir sanal sunucunun (VDS) üzerinde çalıştırırsınız: sanal makine size ayrılmış işlemci ve bellek sağlar, Docker da bu kaynakların içinde servislerinizi düzenli ve yalıtılmış biçimde çalıştırır.
Docker'ı hangi sunucuda çalıştırmalısınız?
Docker'ı çalıştırmak için sunucuda root yetkisine ihtiyacınız vardır; bu yüzden paylaşımlı hosting paketleri yerine bir sanal ya da fiziksel sunucu gerekir. Sanal sunucu tarafında iki seçenekle karşılaşırsınız:
VDS: İşlemci ve bellek size tahsis edilir ve garantilidir. İmaj indirme, build ve aynı anda çalışan birden fazla servis kısa süreli ama yoğun kaynak kullandığı için Docker yükünde öngörülebilir performans sağlar.
VPS: Kaynaklar kullanım hakkı olarak paylaşılır. Tek bir hafif container çalıştırmak, Docker'ı denemek ya da öğrenmek için ekonomik bir başlangıçtır.
Kaynak seçiminde belirleyici ölçüt, aynı anda kaç servis çalıştıracağınızdır. Geliştirme ortamı veya tek bir hafif servis için 2 GB RAM yeterlidir. Uygulama, veritabanı ve reverse proxy'yi Compose ile birlikte çalıştıracaksanız 4–6 GB RAM rahat bir çalışma alanı sunar. Üretim yükü, CI runner veya izleme yığını aynı sunucuda duracaksa 8 GB RAM'i tercih edin. Disk tarafında ise Docker'ın en hızlı tükettiği kaynağın disk olduğunu unutmayın: imaj katmanları, build önbelleği ve volume'lar zamanla birikir.
Docker'ın temel kavramları
İmaj (image): Container'ın salt okunur şablonudur. İşletim sistemi katmanı, çalışma zamanı ve uygulamanızın dosyaları katmanlar hâlinde imajın içindedir. Örnek:
nginx:alpine,postgres:18.Container: Bir imajın çalışan örneğidir. Aynı imajdan istediğiniz kadar container başlatabilirsiniz.
Dockerfile: Kendi imajınızı oluşturmak için yazdığınız tarif dosyasıdır. Hangi temel imajın kullanılacağı, hangi dosyaların kopyalanacağı ve hangi komutun çalışacağı burada tanımlanır.
Registry: İmajların saklandığı depodur. En bilineni Docker Hub'dır; resmî Nginx, PostgreSQL, Redis, Node.js imajları buradan indirilir.
Volume: Container silinse bile korunan kalıcı veri alanıdır. Veritabanı dosyaları gibi kaybolmaması gereken veriler volume'da tutulur.
Network: Container'ların birbiriyle konuştuğu sanal ağdır. Aynı ağdaki container'lar birbirine servis adıyla (ör.
db) ulaşır.
ÖNEMLİ NOT: Container'ın kendi dosya sistemi geçicidir. Container silindiğinde içine yazılan her şey de silinir. Saklamanız gereken verileri mutlaka bir volume'a ya da sunucudaki bir klasöre bağlayın.
Docker kurulumu
Docker Engine'i bir Linux sunucuya kurmanın önerilen yolu, Docker'ın resmî paket deposunu ekleyip paketleri oradan kurmaktır. Dağıtımınıza göre adımlar için resmî kurulum belgesini izleyin: Ubuntu için Docker Engine kurulumu. Kurulumdan sonra her şeyin çalıştığını şu komutla doğrulayabilirsiniz:
sudo docker run hello-worldEkranda "Hello from Docker!" mesajını görüyorsanız Docker Engine çalışıyor demektir. Compose'un da kurulu olduğunu kontrol etmek için:
docker compose versionDocker VDS paketlerimizde bu adımlarla uğraşmanız gerekmez: sunucu, sipariş sırasında seçtiğiniz dağıtımla (Ubuntu 24.04 LTS, Ubuntu 26.04 LTS, Debian 13 veya Debian 12; dördü de Docker'ın resmî destek listesindedir) birlikte Docker Engine CE ve Compose v2 kurulu, tam root ve SSH erişimiyle teslim edilir. Sipariş sırasında tercih ederseniz container'larınızı web arayüzünden yönetebileceğiniz Portainer CE de yönetici hesabı açılmış olarak kurulu gelir.
Komutları her seferinde sudo yazmadan çalıştırmak isterseniz kullanıcınızı docker grubuna ekleyebilirsiniz. Değişikliğin geçerli olması için oturumu kapatıp yeniden açın:
sudo usermod -aG docker $USERÖNEMLİ NOT: Docker'ın resmî belgesine göre
dockergrubu, kullanıcıya root düzeyinde yetki verir. Bu gruba yalnızca güvendiğiniz kullanıcıları ekleyin.
En çok kullanılan Docker komutları
Günlük işlerin büyük kısmı birkaç komutla yapılır. Aşağıdaki örneklerde Nginx imajını kullanıyoruz:
# Docker Hub'dan imaj indirmek
docker pull nginx:alpine
# Arka planda container başlatmak (sunucunun 8080 portu → container'ın 80 portu)
docker run -d --name web -p 8080:80 nginx:alpine
# Çalışan container'ları listelemek (-a ile durmuş olanlar da görünür)
docker ps
docker ps -a
# Container'ın günlüklerini canlı izlemek
docker logs -f web
# Çalışan container'ın içinde komut çalıştırmak
docker exec -it web sh
# Container'ı durdurmak, başlatmak ve silmek
docker stop web
docker start web
docker rm -f web
# Sunucudaki imajları listelemek ve silmek
docker images
docker rmi nginx:alpinedocker run komutundaki -d container'ı arka planda çalıştırır, --name ona akılda kalır bir ad verir, -p 8080:80 ise sunucunun 8080 portuna gelen istekleri container'ın 80 portuna yönlendirir. Bu komuttan sonra tarayıcıda http://sunucu-ip-adresiniz:8080 adresini açtığınızda Nginx karşılama sayfasını görürsünüz.
Kendi imajınızı oluşturmak: Dockerfile
Hazır imajlar veritabanı ve web sunucusu gibi servisler için yeterlidir; kendi uygulamanız için ise bir Dockerfile yazarsınız. Aşağıda basit bir Node.js uygulaması için örnek bir Dockerfile var. Dosyayı projenizin kök dizinine Dockerfile adıyla kaydedin:
FROM node:24-alpine
WORKDIR /app
# Önce yalnızca paket dosyalarını kopyalamak, bağımlılık katmanının önbellekte kalmasını sağlar
COPY package*.json ./
RUN npm ci --omit=dev
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]Projede ayrıca bir .dockerignore dosyası oluşturup node_modules, .git ve .env gibi imaja girmemesi gereken dosyaları buraya yazın. Bu, hem imajı küçültür hem de gizli bilgilerinizin imaja girmesini önler. İmajı oluşturmak ve çalıştırmak için:
docker build -t benim-uygulamam .
docker run -d --name app -p 3000:3000 benim-uygulamamDocker Compose nedir?
Gerçek bir projede tek bir container nadiren yeterli olur: uygulamanın yanında bir veritabanı, belki bir önbellek (Redis) ve bir reverse proxy de çalışır. Bunların her birini ayrı docker run komutlarıyla, doğru ağ ve volume ayarlarıyla başlatmak hem zahmetli hem de hataya açıktır.
Docker Compose, birden fazla container'dan oluşan uygulamaları tek bir YAML dosyasında tanımlayıp tek komutla yönetmenizi sağlar. Servisler, portlar, ortam değişkenleri, volume'lar ve servisler arasındaki bağımlılıklar compose.yaml dosyasında yazılıdır; docker compose up dediğinizde hepsi doğru sırayla ayağa kalkar. Güncel Docker kurulumlarında Compose, docker compose (araya boşluk koyarak) biçiminde kullanılan bir eklenti olarak gelir.
Docker Compose ile ilk projeniz: Uygulama + PostgreSQL
Yukarıdaki Node.js uygulamasını bir PostgreSQL veritabanıyla birlikte çalıştıralım. Proje klasörünüz şöyle görünecek:
benim-uygulamam/
├── compose.yaml
├── Dockerfile
├── .dockerignore
├── .env
├── package.json
└── server.js1. Adım: Ortam değişkenlerini tanımlamak
Parola gibi bilgileri compose.yaml içine doğrudan yazmak yerine aynı klasördeki .env dosyasında tutun. Compose bu dosyayı otomatik olarak okur:
POSTGRES_USER=uygulama
POSTGRES_PASSWORD=guclu-bir-parola-belirleyin
POSTGRES_DB=uygulamaÖNEMLİ NOT:
.envdosyasını Git deposuna göndermeyin;.gitignoredosyanıza ekleyin.
2. Adım: compose.yaml dosyasını yazmak
services:
app:
build: .
ports:
- "3000:3000"
environment:
DATABASE_URL: postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@db:5432/${POSTGRES_DB}
depends_on:
db:
condition: service_healthy
restart: unless-stopped
db:
image: postgres:18
environment:
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: ${POSTGRES_DB}
volumes:
- db-verisi:/var/lib/postgresql
healthcheck:
test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"]
interval: 10s
timeout: 5s
retries: 5
restart: unless-stopped
volumes:
db-verisi:Dosyadaki önemli noktalar:
build: .—appservisi, bulunduğu klasördeki Dockerfile ile oluşturulur.@db:5432— Uygulama veritabanına IP adresiyle değil servis adıyla bağlanır. Compose, aynı projedeki servisleri ortak bir ağa otomatik olarak bağlar.depends_onvehealthcheck— Uygulama, veritabanı yalnızca başlamış değil bağlantı kabul eder hâle geldiğinde başlatılır. Böylece "veritabanına bağlanılamadı" hatasıyla açılışta çöken uygulama sorununun önüne geçilir.db-verisivolume'u — Veritabanı dosyaları container dışında saklanır; container'ı silip yeniden oluştursanız bile verileriniz korunur. PostgreSQL 18 ve sonrası imajlarda veri dizini/var/lib/postgresqlolarak bağlanır; daha eski sürümler için yazılan örneklerde gördüğünüz/var/lib/postgresql/datayolu 18 ile değişmiştir.restart: unless-stopped— Container çöktüğünde ya da sunucu yeniden başladığında servisler otomatik olarak tekrar ayağa kalkar.dbservisindeportsyok — Veritabanı yalnızca Compose ağı içinden erişilebilir, internete açılmaz. Bu bilinçli bir tercihtir.
ÖNEMLİ NOT: İnternette sık rastlanan örneklerin başındaki
version: "3.8"satırına artık gerek yoktur. Docker'ın Compose belgesine göre bu alan eskimiştir; Compose her zaman en güncel şemayı kullanır ve satır yazıldığında yalnızca uyarı verir.
3. Adım: Projeyi başlatmak
Proje klasöründeyken şu komutu çalıştırın:
docker compose up -d --buildCompose önce app imajını oluşturur, PostgreSQL imajını indirir, ağı ve volume'u kurar, veritabanı hazır olduğunda da uygulamayı başlatır. Durumu kontrol etmek için:
docker compose psİki servisin de running (veritabanı için healthy) göründüğünü kontrol edin. Uygulamanız artık http://sunucu-ip-adresiniz:3000 adresinde çalışıyor.
4. Adım: Günlük işler için Compose komutları
# Tüm servislerin günlüklerini canlı izlemek (tek servis için sonuna adını yazın)
docker compose logs -f
docker compose logs -f app
# Servisin içinde komut çalıştırmak (ör. veritabanına bağlanmak)
docker compose exec db psql -U uygulama -d uygulama
# Kod değişikliğinden sonra uygulamayı yeniden oluşturup başlatmak
docker compose up -d --build app
# Tek bir servisi yeniden başlatmak
docker compose restart app
# Projeyi durdurup container'ları ve ağı kaldırmak (volume'lar korunur)
docker compose downÖNEMLİ NOT:
docker compose down -vkomutu volume'ları da siler. Bu, veritabanınızdaki bütün verilerin geri dönüşsüz biçimde silinmesi demektir. Yalnızca verileri bilerek sıfırlamak istediğinizde kullanın.
Sunucuda Docker kullanırken dikkat edilmesi gerekenler
Güvenlik duvarı ve açık portlar: Docker,
portsile dışarı açtığınız portlar için kendi iptables kurallarını yazar. Docker'ın resmî belgesine göre bu trafik ufw ve firewalld kurallarından önce yönlendirilir; yani ufw'de kapattığınızı düşündüğünüz bir port, container tarafından yayınlanıyorsa internetten erişilebilir olur. İnternete açılması gerekmeyen servislerdeportskullanmayın ya da yalnızca sunucunun kendisine açın:"127.0.0.1:5432:5432".Disk kullanımı: Kullanılmayan imajlar, durmuş container'lar ve build önbelleği zamanla diski doldurur. Ne kadar yer kapladıklarını
docker system dfile görebilir, kullanılmayanlarıdocker system pruneile temizleyebilirsiniz.docker system prunevolume'lara varsayılan olarak dokunmaz;--volumeseklediğinizde kullanılmayan volume'lar da silinir.Sürüm etiketleri: Canlı ortamda
latestetiketi yerine belirli bir sürüm (ör.postgres:18) kullanın. Aksi hâlde bir gün imajı yeniden indirdiğinizde beklemediğiniz bir ana sürüm yükseltmesiyle karşılaşabilirsiniz.Yedekleme: Volume'lar container silindiğinde korunur, ancak sunucuda yaşanabilecek bir sorun ya da yanlış bir komut karşısında yedeğin yerini tutmaz. Veritabanlarınızı düzenli olarak dışa aktarın; PostgreSQL için örnek:
docker compose exec db pg_dump -U uygulama uygulama > yedek.sql. Yedeklerinizi sunucu dışında saklamak için yedekleme hizmetimizden yararlanabilirsiniz.Alan adı ve SSL: Uygulamanızı
:3000gibi bir portla değil alan adınızla ve HTTPS üzerinden yayınlamak için önüne Nginx, Caddy veya Traefik gibi bir reverse proxy koymanız gerekir. Alan adınızın sunucuya yönlendirilmesi için temel DNS işlemleri yazımıza göz atabilirsiniz.
Sık karşılaşılan sorunlar
permission denied while trying to connect to the Docker daemon socketKullanıcınızdockergrubunda değil. Komutusudoile çalıştırın ya da kullanıcınızı gruba ekleyip oturumu yeniden açın.port is already allocatedSunucuda aynı portu kullanan başka bir container veya servis var.docker psile kontrol edin ya daportssatırında sol taraftaki (sunucu) portu değiştirin, ör."3001:3000".Uygulama veritabanına bağlanamıyor. Bağlantı adresinde
localhostyazıyorsa servis adıyla değiştirin. Container içindelocalhost, veritabanını değil container'ın kendisini gösterir; doğru adres bu örnektedb'dir.Container sürekli yeniden başlıyor. Uygulama açılırken hata veriyordur. Sebebini
docker compose logs appile görebilirsiniz.Yaptığım kod değişikliği görünmüyor. Kod imajın içine kopyalandığı için değişiklikten sonra imajın yeniden oluşturulması gerekir:
docker compose up -d --build.Disk doldu.
docker system dfile neyin yer kapladığını görün ve kullanılmayanlarıdocker system pruneile temizleyin.
Sıkça sorulan sorular
Docker ücretsiz mi?
Sunucularda kullanılan Docker Engine açık kaynaklıdır ve ücretsizdir. Ücretli abonelik şartı, masaüstü uygulaması Docker Desktop'ın büyük kuruluşlarda ve kamu kurumlarında profesyonel kullanımı için geçerlidir; ayrıntılar Docker Desktop lisans sayfasında yer alır. Linux sunucunuzdaki Docker Engine ve Compose bu kapsamda değildir.
Docker paylaşımlı hosting paketlerinde çalışır mı?
Hayır. Docker'ı çalıştırmak için sunucuda root yetkisi gerekir; bu da paylaşımlı hosting ortamında mümkün değildir. Docker için root erişimli bir sanal sunucu (VDS) ya da fiziksel sunucu kullanmanız gerekir.
docker-compose ile docker compose arasındaki fark nedir?
docker-compose (tireli), Compose'un artık kullanılmayan ilk sürümüdür. Güncel sürüm Docker CLI'ın bir eklentisidir ve docker compose (boşluklu) biçiminde çalıştırılır. Eski belgelerde gördüğünüz komutlarda tireyi boşlukla değiştirmeniz yeterlidir.
Dosyamın adı docker-compose.yml mi olmalı, compose.yaml mı?
Compose iki adı da tanır. Güncel belgelerde önerilen ad compose.yaml'dır; mevcut projelerinizdeki docker-compose.yml dosyalarını değiştirmeniz gerekmez.
Docker için ne kadar RAM ve disk gerekir?
Docker Engine'in kendisi az kaynak kullanır; asıl ihtiyacı çalıştırdığınız servisler belirler. Tek bir hafif servis için 2 GB RAM, Compose ile uygulama + veritabanı + reverse proxy için 4–6 GB RAM, üretim yükü veya CI runner için 8 GB RAM iyi bir başlangıçtır. Disk ise Docker sunucularında genellikle en hızlı dolan kaynaktır. Bu nedenle Docker VDS paketlerimizde disk, aynı işlemci ve bellek değerlerindeki standart Türkiye VDS paketlerine göre daha geniş tutulmuştur. İhtiyacınız büyüdüğünde işlemci, bellek ve disk kaynaklarınızı destek talebi açarak yükseltebilirsiniz.
Docker VDS ile standart VDS arasındaki fark nedir?
İkisi de aynı altyapıda, Türkiye lokasyonunda çalışır. Docker VDS'te sunucu Docker Engine ve Compose kurulu olarak ve Docker kullanımına göre büyütülmüş diskle gelir. Standart VDS'te sunucu boş teslim edilir ve her şeyi kendiniz kurarsınız. Docker kullanmayacaksanız standart VDS paketleri daha uygun bir seçenektir.
Container'larımı komut satırı yerine arayüzden yönetebilir miyim?
Evet. Portainer CE gibi web arayüzleriyle container, imaj ve volume'larınızı tarayıcıdan yönetebilirsiniz. Docker VDS paketlerimizde Portainer CE sipariş sırasında tercihe bağlı olarak kurulur ve yönetici hesabı açılmış olarak teslim edilir.
Resmî kaynaklar
Sonuç
Docker, uygulamanızı bağımlılıklarıyla birlikte paketleyip her ortamda aynı şekilde çalıştırmanın en pratik yoludur; Docker Compose ise uygulama, veritabanı ve diğer servisleri tek bir dosyadan yönetmenizi sağlar. Bu yazıdaki compose.yaml örneğini kendi projenize uyarlayarak birkaç dakika içinde çalışan bir ortam kurabilirsiniz. Kurulumda takılırsanız destek talebi açarak 7/24 Türkçe destek ekibimizden yardım alabilirsiniz.
Docker Engine ve Compose kurulu, tam root erişimli bir sunucuyla hemen başlamak isterseniz Docker VDS paketlerimizi inceleyebilirsiniz.

