Docker Nedir? Nasıl ve Neden Kullanılır?

Erhan ÜRGÜNErhan ÜRGÜN
6 min read

Geliştirdiğiniz uygulamanın bir makinede mükemmel çalışırken, başka bir ortamda sorun çıkardığına şahit oldunuz mu? Veya bir sunucuda sorunsuz çalışan bir yazılımın, güncellemelerden sonra beklenmedik hatalar verdiği anlarla karşılaştınız mı? İşte Docker, tam da bu noktada size hayat kurtaran bir çözüm sunuyor.

Bu yazıda, Docker’ın ne olduğundan, neden bu kadar popüler hale geldiğinden ve nasıl işinizi ciddi anlamda kolaylaştırabileceğinden bahsedeceğim. Üstelik size birkaç pratik ipucu vererek, Docker’ı hızla kullanmaya başlamanızı sağlayacağım. Eğer bir yazılımcı ya da DevOps mühendisiyseniz ve hala Docker kullanmıyorsanız, eksik bir parça olduğunu hissedeceksiniz.

Hazırsanız, hadi başlayalım!

Docker Nedir?

Docker, yazılımlarınızı her yerde, her zaman, aynı sorunsuzlukta çalıştırmanızı sağlayan bir konteyner platformudur. Bu, bir geliştiricinin en sık yaşadığı “çalışıyor ama… başka bir ortamda değil” problemini ortadan kaldırır. Docker sayesinde uygulamalar, bağımlılıklarıyla birlikte izole bir ortamda çalışır, böylece yazılım geliştirme ve dağıtım süreciniz çok daha tutarlı hale gelir. Artık “Benim bilgisayarımda çalışıyor!” cümlesini tarihe gömebiliriz.

Docker’ın Temel Bileşenleri

  1. Konteyner: Uygulamanızın izole bir ortamda çalışmasını sağlar. Bu sayede, sistem kaynaklarını verimli kullanarak uygulamalar arasında bir çakışma yaşamazsınız.

  2. İmaj: Konteyner oluşturmak için gerekli tüm yapılandırmayı içeren şablondur. Geliştirdiğiniz uygulamanın her ortama aynı şekilde dağıtılmasını sağlar.

  3. Docker Daemon: İmajlarınızı ve konteynerlerinizi yöneten “arka plandaki beyin”dir. Siz komut verirsiniz, o işini yapar.

  4. Docker Hub: İmajlarınızı sakladığınız, paylaştığınız ve başkalarından ilham aldığınız bulut platformudur. Kendi projelerinizi daha geniş bir kitleye duyurmanın da harika bir yolu.

Neden Docker Kullanmalıyız?

Eğer projelerinizi daha hızlı dağıtmak, kaynaklarınızı daha verimli kullanmak ve sürekli başınızı ağrıtan “çalışmıyor” problemini ortadan kaldırmak istiyorsanız, Docker sizin için biçilmiş kaftan. İşte Docker’ı neden kullanmanız gerektiğine dair en kritik nedenler:

1. Taşınabilirlik ve Tutarlılık

Docker ile uygulamanız bir makinede nasıl çalışıyorsa, her yerde aynı şekilde çalışır. Geliştirme, test ve üretim ortamları arasında “acaba çalışacak mı?” stresi yaşamazsınız. Uygulamanız, her yerde aynı Docker imajıyla çalışır. Bir kez yapılandırın, her yerde sorunsuz kullanın.

2. Kaynak Verimliliği

Geleneksel sanal makineler, büyük bir kaynak israfına sebep olabilir. Docker ise işletim sistemi çekirdeğini paylaştığı için çok daha hafif ve hızlıdır. Bir sunucuda çok sayıda Docker konteyneri çalıştırarak aynı donanımla daha fazla iş yapabilirsiniz.

3. Hızlı Dağıtım

Yavaş dağıtım süreçlerinden sıkıldınız mı? Docker ile uygulamanızı dakikalar içinde başlatabilir, değişiklikleri hızla hayata geçirebilirsiniz. CI/CD süreçlerinde Docker kullanmak, ekibinizin hızını ve verimliliğini artıracaktır.

4. İzolasyon

Docker, uygulamalarınızı izole bir ortamda çalıştırdığı için, bir uygulamanın diğerini bozması gibi bir problem yaşamazsınız. Her şey güvenli, izole ve kontrol altında.

5. Versiyon Kontrolü

Docker imajlarıyla sürüm kontrolü yapmak çok kolaydır. Uygulamanızın her versiyonunu Docker ile takip edebilir, hangi versiyonun ne zaman dağıtıldığını her zaman bilirsiniz. Geri dönüş yapmak gerekirse, sadece eski imajınızı çalıştırmanız yeterli.

Docker ile Başlarken

Docker’ın gücünden yararlanmaya başlamak için temel birkaç komutu öğrenmeniz yeterli. İşte Docker ile en çok kullanacağınız komutlar:

Oluşturma ve Çalıştırma

  • İmaj İndirme:

      docker pull {image}             # Belirtilen imajı indirir  
      docker pull {image}:{version}   # Belirtilen sürümdeki imajı indirir
    
  • Konteyner Oluşturma ve Çalıştırma:

      docker run {image}                          # Yeni bir konteyner oluşturur ve çalıştırır
      docker run -d {image}                       # Arka planda çalıştırır
      docker run -it {image}                      # Terminal etkileşimi ile çalıştırır
      docker run --name {container_name} {image}  # Belirli bir isimle çalıştırır
    
  • Çalışanları Listeleme:

      docker ps -a    # Tüm konteynerleri listeler
      docker images   # Mevcut imajları listeler
    

Silme İşlemleri

  • Konteyner Silme:

      docker rm {container_id}                        # Belirtilen konteyneri siler
      docker container rm $(docker container ls -aq)  # Tüm konteynerleri siler
    
  • İmaj Silme:

      docker rmi {image_id}         # Belirtilen imajı siler
    

Durdurma ve Yeniden Başlatma

  • Durdurma:

      docker stop {container_id}    # Konteyneri durdurur
      docker kill {container_id}    # Konteyneri zorla durdurur
    
  • Yeniden Başlatma:

      docker start {container_id}   # Durdurulmuş bir konteyneri başlatır
    

Docker ile Veritabanı Yönetimi

Docker, veritabanlarıyla çalışmayı da kolaylaştırır. Örneğin, bir PostgreSQL veritabanını hızlıca başlatmak için şu adımları izleyebilirsiniz:

docker run --name postgres -e POSTGRES_PASSWORD={db_sifreniz} -d postgres

Bu komut, postgres adında bir konteyner oluşturur ve db_sifreniz şifresiyle PostgreSQL veritabanını başlatır. Veritabanı bağlantıları için gerekli olan port yönlendirmelerini ayarlamayı unutmayın!

Kalıcı Veri Tutma

Docker konteynerleri varsayılan olarak geçici (stateless) veri saklar. Ancak, kalıcı veri tutmak için volume (hacim) oluşturmak gerekir. Aşağıda bir örnek verilmiştir:

docker run -d -v /doya/yolu/data:/data --name mydata myimage

Bu komut, yerel dosya sistemindeki /doya/yolu/data dizinini konteyner içindeki /data dizinine bağlar. Böylece konteyner silinse bile veriler kaybolmaz.

Docker Compose Kullanımı

Docker Compose, çoklu konteyner uygulamalarını yönetmek için kullanılır. Projenizdeki tüm hizmetleri tanımlamak için bir docker-compose.yml dosyası oluşturabilirsiniz. Aşağıda basit bir örnek verilmiştir:

version: "3.8"

services:
  linkstack:
    hostname: 'linkstack'
    image: 'linkstackorg/linkstack:latest'
    environment:
      TZ: 'Europe/Istanbul'
      SERVER_ADMIN: 'admin@erho.dev'
      HTTP_SERVER_NAME: 'erho.dev'
      HTTPS_SERVER_NAME: 'erho.dev'
      LOG_LEVEL: 'info'
      PHP_MEMORY_LIMIT: '256M'
      UPLOAD_MAX_FILESIZE: '8M'
    volumes:
      - '/htdocs'
    ports:
      - '8080:80'
      - '8081:443'
    restart: unless-stopped
    user: apache:apache
    # read_only: true
    depends_on:
      - mysql
    links:
      - mysql
  mysql:
    image: mysql:8
    environment:
        MYSQL_ROOT_PASSWORD: "db_sifreniz"
    ports:
        - 3306:3306

Komut satırında docker-compose up yazarak bu hizmetleri başlatabilirsiniz.

Konteynerleri Güncelleme

Aşağıdaki komutları kullanarak yeni yapılandırmaya göre imajları güncelleyip çalıştırabilirsiniz:

# Yalnızca yapılandırmayı yeniden oluşturun, ancak volume'leri (veri) silmeyin.
docker-compose up -d --force-recreate --build

Bu komut, docker-compose.yml dosyasını temel alarak yeni imajları oluşturur ve mevcut volume'leri koruyarak konteynerleri yeniden başlatır. Bu sayede verileriniz kaybolmaz.

docker-compose up -d --force-recreate --remove-orphans

Bu komut aşağıdaki işlemleri yapar:

  1. up -d: Docker Compose'u arka planda (-d) başlatır ve docker-compose.yml dosyasına göre servisleri çalıştırır.

  2. --force-recreate: Mevcut tüm konteynerleri yeniden oluşturur, yani yapılandırma değişmiş olsa da olmasa da mevcut konteynerleri durdurur ve tamamen yeniden yaratır. Bu sırada volume’leri (veri) silmez, yani veri kaybı olmaz.

  3. --remove-orphans: docker-compose.yml dosyasında tanımlı olmayan ancak aynı ağ üzerinde çalışan diğer konteynerleri (yetim konteynerleri) durdurur ve siler. Bu, yalnızca ilgili docker-compose.yml yapılandırmasında olmayan, gereksiz konteynerlerin ortadan kaldırılmasını sağlar.

Bu komut, docker-compose.yml dosyasındaki tüm servisleri yeniden oluşturur ve güncel olmayan konteynerlerden (yetim) kurtulurken verilerinizi silmeden yeni yapılandırmayı uygular.

3. Güncelleme Sonrası Durumu Kontrol Etme

Güncellemelerin başarıyla uygulandığından emin olmak için aşağıdaki komutları kullanarak konteynerlerin durumunu ve loglarını kontrol edebilirsiniz:

docker-compose ps          # Konteyner durumunu kontrol eder
docker-compose logs -f   # Günlükleri takip eder

Ağ Yönetimi

Docker, konteynerler arası iletişimi sağlamak için ağ yapılandırmalarına olanak tanır. Kullanıcı tanımlı özel ağlar oluşturabilir ve konteynerlerinizi bu ağlar üzerinde çalıştırabilirsiniz.

  • Ağ Oluşturma:

      docker network create --driver bridge mynetwork   # Yeni bir ağ oluşturur
    
  • Ağ Listeleme:

      docker network ls   # Mevcut ağları listeler
    
  • Ağ Silme:

      docker network rm {network_name}  # Belirtilen ağı siler
    

Docker Hub’a Pushlama

Kendi oluşturduğunuz imajları paylaşmak için Docker Hub’a yükleyebilirsiniz. Bu, işbirlikçi projelerde yararlıdır.

docker login                                                         # Docker Hub’a giriş yapar                      
docker tag {image_adi} {dockerhub_kullanici_adiniz}/{yeni_imaj_adi}  # İmajı Docker Hub’a yüklemek için etiketler
docker push {your_dockerhub_username}/{new_image_name}               # İmajı Docker Hub’a yükler

Toplu Temizlik

Docker kullanırken biriken kullanılmayan konteyner ve imajları temizlemek önemlidir. Aşağıdaki komutlar kullanılmayan tüm konteyner ve imajları temizler:

docker container prune  # Kullanılmayan konteynerleri siler
docker image prune      # Kullanılmayan imajları siler

Bu yazı, Docker Resmi Dokümantasyonu, KablosuzKedi'nin Docker Videoları ve kişisel deneyimlerim doğrultusunda hazırlanmıştır.

Hala Docker kullanmıyorsanız, emin olun eksik bir şeyler var! Docker kullanmaya başlamak sadece birkaç komut uzağınızda. Üstelik öğrendiğinizde, projelerinizi daha tutarlı, güvenilir ve verimli bir şekilde yönetebileceksiniz. Docker’ın sunduğu bu gücü kendi projelerinizde denemekten çekinmeyin.

Bu yazı, Docker’a ilk adımı atmanız için küçük bir rehber niteliğinde hazırlandı. Docker hakkında daha fazla bilgi edinmek için resmi dokümantasyonu incelemenizi ve KablosuzKedi'nin binbir emekle hazırladığı Docker videolarını da ayrıca izlemenizi şiddetle tavsiye ederim!

Sorularınız ya da daha fazla bilgi almak isterseniz, yorumlarda belirtin... Docker yolculuğunuzda size yardımcı olmaktan memnuniyet duyarım!

Dipnot: Bu yazı zaman zaman güncellenebilir, bu yüzden takipte kalın!


Daha fazlası için takipte kalın!

  • https://linktr.ee/erhanurgun

  • https://erhanurgun.com.tr

  • https://erho.dev

4
Subscribe to my newsletter

Read articles from Erhan ÜRGÜN directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Erhan ÜRGÜN
Erhan ÜRGÜN

PHP | Laravel | NodeJS | AdonisJS | Back-End Developer