Docker Nedir? Nasıl ve Neden Kullanılır?
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
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.
İ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.
Docker Daemon: İmajlarınızı ve konteynerlerinizi yöneten “arka plandaki beyin”dir. Siz komut verirsiniz, o işini yapar.
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:
up -d
: Docker Compose'u arka planda (-d
) başlatır vedocker-compose.yml
dosyasına göre servisleri çalıştırır.--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.--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 ilgilidocker-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
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