YAZILIM

Droplet Üzerine Docker Kurup Container Deploy Etme

Droplet Üzerine Docker Kurup Container Deploy Etme yazısının kapak görseli

Bir uygulamayı sunucuya taşırken ortam farklılıklarından kaynaklanan sorunlarla karşılaşmak yaygın bir durum. Kendi bilgisayarında sorunsuz çalışan bir proje, farklı bir Node.js sürümü ya da eksik bir sistem bağımlılığı yüzünden sunucuda çalışmayabiliyor. Docker, bu sorunu kökten çözüyor, çünkü uygulamayı çalıştığı ortamla birlikte tek bir pakette taşıyor. Bu yazıda bir Ubuntu Droplet üzerine Docker’ın nasıl kurulduğunu, bir uygulamanın nasıl container’a alındığını ve bu container’ın sunucu üzerinde nasıl çalıştırıldığını adım adım anlatıyorum.

Bu yazıyı takip edebilmek için elde hazır bir Droplet ve sunucuya SSH ile bağlanma bilgisi bulunmalı.

Docker Nedir, Neden Tercih Edilir

Docker, bir uygulamayı kodu, çalışma zamanı, sistem araçları ve kütüphaneleriyle birlikte standart bir birim haline getiren bir konteynerleştirme teknolojisi. Bu birime “image” deniyor, image’dan başlatılan çalışan örneğe ise “container” deniyor. Bir container, sanal makineye benzese de çok daha hafif çalışıyor, çünkü işletim sisteminin çekirdeğini host sistemle paylaşıyor.

Bu yaklaşımın en büyük avantajı, “bende çalışıyordu” sorununu ortadan kaldırması. Bir image bir kez oluşturulduğunda, geliştirme ortamında, test sunucusunda ya da üretim ortamında birebir aynı şekilde çalışıyor. Ayrıca birden fazla uygulamanın aynı Droplet üzerinde birbirini etkilemeden, izole bir şekilde çalışması da Docker sayesinde mümkün oluyor.

Adım 1: Docker Kurulumu

DigitalOcean, Docker’ın önceden kurulu geldiği bir “1-Click” Droplet imajı sunuyor, fakat kurulumu elle yapmak sürüm ve yapılandırma üzerinde tam kontrol sağlıyor. Mevcut bir Ubuntu Droplet üzerine Docker kurmak için önce sistem paketleri güncelleniyor:

sudo apt update
sudo apt install apt-transport-https ca-certificates curl software-properties-common -y

Ardından Docker’ın resmi GPG anahtarı ekleniyor:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

Docker’ın resmi paket deposu sisteme tanıtılıyor:

echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

Paket listesi yeniden güncellenip Docker kuruluyor:

sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin -y

Kurulumun tamamlandığı şu komutla kontrol edilebiliyor:

sudo docker --version

Bu komutun bir sürüm numarası döndürmesi, Docker’ın başarıyla kurulduğunu gösteriyor.

Adım 2: Root Olmayan Bir Kullanıcıyla Docker Kullanımı

Docker komutlarını her seferinde sudo ile çalıştırmak yerine, mevcut kullanıcının Docker grubuna eklenmesi işleri kolaylaştırıyor:

sudo usermod -aG docker $USER

Bu komuttan sonra oturumun kapatılıp yeniden açılması gerekiyor, aksi halde grup değişikliği hemen etkinleşmiyor. Değişikliğin uygulandığı groups komutuyla kontrol edilebiliyor, çıktıda docker grubunun görünmesi gerekiyor.

Adım 3: Uygulama İçin Dockerfile Hazırlama

Bir uygulamanın container’a alınabilmesi için proje kök dizininde bir Dockerfile bulunması gerekiyor. Bir Node.js uygulaması için örnek bir Dockerfile şu şekilde yazılabiliyor:

FROM node:20-alpine

WORKDIR /app

COPY package*.json ./
RUN npm ci --only=production

COPY . .

EXPOSE 3000
CMD ["node", "server.js"]

Bu dosyada FROM satırı hangi temel image üzerine inşa edileceğini belirtiyor, WORKDIR container içindeki çalışma dizinini tanımlıyor, COPY ve RUN satırları bağımlılıkların kurulmasını sağlıyor, EXPOSE uygulamanın hangi portu dinlediğini belirtiyor ve CMD container başlatıldığında çalıştırılacak komutu tanımlıyor.

Gereksiz dosyaların image’a dahil edilmemesi için proje kök dizinine bir .dockerignore dosyası eklenmesi de öneriliyor:

node_modules
.git
.env

Adım 4: Image Oluşturma ve Container Başlatma

Dockerfile hazır olduğunda, proje dizinindeyken şu komutla bir image oluşturuluyor:

docker build -t uygulama-adi .

Bu komut, Dockerfile’daki adımları sırayla çalıştırıp uygulama-adi etiketiyle bir image üretiyor. İşlem tamamlandığında oluşturulan image’lar docker images komutuyla listelenebiliyor.

Image’dan bir container başlatmak için şu komut kullanılıyor:

docker run -d -p 80:3000 --name uygulama-container uygulama-adi

Bu komutta -d bayrağı container’ın arka planda çalışmasını sağlıyor, -p 80:3000 sunucunun 80 numaralı portunu container içindeki 3000 numaralı porta yönlendiriyor, --name container’a bir isim veriyor. Komut çalıştırıldıktan sonra tarayıcıdan Droplet’in IP adresine gidildiğinde uygulama görüntülenebiliyor.

Adım 5: Container’ları Yönetme

Çalışan container’ların listesi şu komutla görülebiliyor:

docker ps

Bir container’ın loglarını takip etmek için:

docker logs -f uygulama-container

Container’ı durdurmak ve silmek için:

docker stop uygulama-container
docker rm uygulama-container

Kodda bir değişiklik yapıldığında image’ın yeniden oluşturulması ve container’ın yeniden başlatılması gerekiyor. Bu süreç birkaç komuttan oluşuyor, fakat birden fazla container yönetiliyorsa Docker Compose kullanmak süreci ciddi şekilde sadeleştiriyor.

Docker Compose ile Çoklu Container Yönetimi

Bir uygulama genellikle tek başına çalışmıyor, yanında bir veritabanı, bir cache katmanı ya da bir ters proxy gerekebiliyor. Bu durumda her container’ı ayrı ayrı docker run komutuyla yönetmek yerine Docker Compose kullanmak daha pratik oluyor. Proje kök dizinine bir docker-compose.yml dosyası eklenerek tüm servisler tek bir dosyada tanımlanabiliyor:

version: "3.9"
services:
  app:
    build: .
    ports:
      - "80:3000"
    environment:
      - NODE_ENV=production
    restart: unless-stopped

Bu dosya hazır olduğunda tüm servisler tek bir komutla ayağa kaldırılabiliyor:

docker compose up -d

restart: unless-stopped ayarı, sunucu yeniden başlatıldığında container’ın da otomatik olarak yeniden başlamasını sağlıyor, bu özellikle üretim ortamlarında kesintisizlik açısından önemli bir detay.

Sık Karşılaşılan Sorunlar

Permission denied hatası alınıyor: Kullanıcının Docker grubuna eklenmesinin ardından oturumun yeniden açılmadığı durumlarda bu hata ortaya çıkıyor. Oturum kapatılıp tekrar açıldığında sorun genellikle çözülüyor.

Container hemen kapanıyor: Bu durum çoğunlukla uygulamanın başlatılamamasından ya da beklenen bir ortam değişkeninin eksik olmasından kaynaklanıyor. docker logs komutuyla container’ın neden durduğu görülebiliyor.

Port zaten kullanımda hatası: Sunucuda aynı portu kullanan başka bir servis (örneğin Nginx) çalışıyor olabilir. sudo lsof -i :80 komutuyla o portu kullanan sürecin ne olduğu tespit edilebiliyor.

Sonraki Adımlar

Uygulama artık Docker üzerinde container olarak çalışıyor durumda. Buradan sonra bir CI/CD sürecine bağlanarak her kod değişikliğinde otomatik build ve deploy yapılabilir, birden fazla Droplet üzerinde ölçeklendirme için Docker Swarm ya da Kubernetes değerlendirilebilir. Bu seriye kadar anlatılan Droplet, App Platform, Nginx, Managed Database, Spaces ve Docker konuları bir araya geldiğinde DigitalOcean üzerinde kapsamlı bir uygulama altyapısı kurmak için gereken temel yapı taşları tamamlanmış oluyor.

Kendi Droplet’ini kurup Docker ile denemek istersen, referans linkim üzerinden kayıt olarak bana destek olabilirsin.

Tüm projelerim ve üzerinde çalıştığım konuları incelemek istersen https://hub.barisgunduz.com/ adresini ziyaret edebilirsin.

Web ve mobil teknolojilere ilgi duyuyorum. Yaklaşık 14 yıldır web geliştirme ve internet reklamcılığı üzerinde çalışıyorum. Web yazılım teknolojileri ve yönetimi konusunda uzmanım. Birçok şirkete teknoloji ve reklamcılık danışmanlığı verdim. Hâlâ bazılarına destek vermeye devam ediyorum. Kendi projelerimle ilgili bazı çalışmalarım var. Çoğu içerik üreticiliği ile ilgili. Projelerimin hepsi Gündüz Medya markası altında toplanmıştır.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir