Docker Nedir?
Docker, uygulamaları ve bağımlılıklarını paketleyerek, herhangi bir ortamda tutarlı bir şekilde çalışmasını sağlayan bir platformdur. Bu paketlere container denir. Docker, geliştiricilerin, uygulamalarını geliştirmelerini, göndermelerini ve çalıştırmalarını kolaylaştırır. Sanallaştırma teknolojisine benzer, ancak daha hafiftir ve kaynakları daha verimli kullanır.
- Temel Kavramlar: Docker imajları, container'lar, Dockerfile, Docker Hub, Docker Compose
- Avantajları: Taşınabilirlik, izolasyon, ölçeklenebilirlik, verimlilik
Container Nedir? Sanal Makine ile Arasındaki Fark Nedir?
Container, bir uygulamanın çalışması için gerekli olan her şeyi (kod, runtime, sistem araçları, sistem kütüphaneleri, ayarlar) içeren, izole edilmiş bir ortamdır. Sanal makineler (VM'ler) ise, fiziksel bir donanımın sanallaştırılmış bir kopyasıdır ve kendi işletim sistemlerine sahiptir.
Temel Farklar:
- Boyut ve Ağırlık: Container'lar, VM'lere göre çok daha küçüktür ve daha az kaynak tüketir. VM'ler, tam bir işletim sistemi içerdiğinden daha büyüktür ve daha fazla kaynak gerektirir.
- Başlangıç Süresi: Container'lar saniyeler içinde başlatılabilirken, VM'lerin başlatılması daha uzun sürer.
- Kaynak Kullanımı: Container'lar, host işletim sisteminin kernel'ini paylaşır ve kaynakları daha verimli kullanır. VM'ler ise, kendi işletim sistemlerine sahip olduklarından daha fazla kaynak tüketir.
Özellik | Container | Sanal Makine (VM) |
---|---|---|
Boyut | Küçük (MB) | Büyük (GB) |
Başlangıç Süresi | Hızlı (saniyeler) | Yavaş (dakikalar) |
Kaynak Kullanımı | Düşük | Yüksek |
İzolasyon | İşlem seviyesinde | Donanım seviyesinde |
İşletim Sistemi | Host OS kernel'ini paylaşır | Kendi OS'si var |
Örnek: Bir web uygulamasını düşünelim. Container kullanarak, uygulamanın tüm bağımlılıklarını (örneğin, Python runtime, gerekli kütüphaneler) bir container içine paketleyebiliriz. Bu container, herhangi bir Docker ortamında tutarlı bir şekilde çalışacaktır. VM kullanarak ise, tam bir işletim sistemi (örneğin, Ubuntu) kurmamız ve ardından uygulamanın bağımlılıklarını bu işletim sistemi üzerinde kurmamız gerekir.
Docker İmajı Nedir? Dockerfile Nedir?
Docker İmajı, bir container oluşturmak için kullanılan salt okunur bir şablondur. İçerisinde uygulamanın kodu, runtime, sistem araçları, sistem kütüphaneleri ve ayarları bulunur. İmajlar, Docker Hub gibi bir registry'de saklanabilir ve paylaşılabilir.
Dockerfile, bir Docker imajını oluşturmak için kullanılan bir metin dosyasıdır. İçerisinde, imajın nasıl oluşturulacağını belirten talimatlar bulunur. Bu talimatlar, temel imajı belirtme, dosya kopyalama, komut çalıştırma ve ortam değişkenleri ayarlama gibi işlemleri içerir.
Dockerfile Örneği:
# Temel imaj olarak Ubuntu'yu kullan
FROM ubuntu:latest
# Gerekli paketleri yükle
RUN apt-get update && apt-get install -y python3 python3-pip
# Uygulama dosyalarını kopyala
COPY . /app
# Çalışma dizinini ayarla
WORKDIR /app
# Bağımlılıkları yükle
RUN pip3 install -r requirements.txt
# Uygulamayı çalıştır
CMD ["python3", "app.py"]
Adım Adım İmaj Oluşturma:
- Bir Dockerfile oluşturun.
docker build
komutunu kullanarak imajı oluşturun:docker build -t my-app .
- Oluşturulan imajı
docker images
komutu ile listeleyebilirsiniz. - İmajı Docker Hub'a gönderebilirsiniz (isteğe bağlı).
Linux'ta Container Oluşturma ve Yönetme Adımları
Linux'ta container oluşturma ve yönetme adımları şunlardır:
- Docker Kurulumu: Linux dağıtımınıza uygun Docker kurulumunu yapın. Örneğin, Ubuntu için:
sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
- Docker Hizmetini Başlatma:
sudo systemctl start docker
- Docker İmajını İndirme: Docker Hub'dan bir imaj indirin (örneğin, Ubuntu):
docker pull ubuntu:latest
- Container Oluşturma: İndirilen imajdan bir container oluşturun:
docker run -it ubuntu:latest /bin/bash
-it
: İnteraktif terminal moduubuntu:latest
: İmaj adı ve etiketi/bin/bash
: Container içinde çalıştırılacak komut
- Container Yönetimi: Container'ları yönetmek için aşağıdaki komutları kullanabilirsiniz:
docker ps
: Çalışan container'ları listeler.docker ps -a
: Tüm container'ları listeler (çalışan ve durmuş).docker stop [container_id]
: Container'ı durdurur.docker start [container_id]
: Container'ı başlatır.docker restart [container_id]
: Container'ı yeniden başlatır.docker rm [container_id]
: Container'ı siler.docker exec -it [container_id] /bin/bash
: Çalışan bir container'a bağlanır.
Örnek: Bir Nginx web sunucusu çalıştırmak için:
- Nginx imajını indirin:
docker pull nginx:latest
- Container'ı oluşturun ve 80 portunu host makinenin 80 portuna eşleyin:
docker run -d -p 80:80 nginx:latest
-d
: Arka planda çalıştır-p 80:80
: Host makinenin 80 portunu container'ın 80 portuna eşle
- Web tarayıcınızda
http://localhost
adresine giderek Nginx'in çalıştığını doğrulayın.
Docker Compose Nedir? Nasıl Kullanılır?
Docker Compose, birden fazla container'dan oluşan uygulamaları tanımlamak ve çalıştırmak için kullanılan bir araçtır. Bir YAML dosyası kullanarak, uygulamanın servislerini, ağlarını ve volume'lerini tanımlayabilirsiniz. Docker Compose, karmaşık uygulamaların kolayca yönetilmesini sağlar.
Compose Dosyası (docker-compose.yml) Örneği:
version: "3.9"
services:
web:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./html:/usr/share/nginx/html
db:
image: postgres:13
environment:
POSTGRES_USER: myuser
POSTGRES_PASSWORD: mypassword
POSTGRES_DB: mydb
volumes:
- db_data:/var/lib/postgresql/data
volumes:
db_data:
Açıklama:
version
: Docker Compose dosya formatının versiyonuservices
: Uygulamanın servislerini tanımlar (örneğin, web, db)image
: Servis için kullanılacak Docker imajıports
: Host makine ile container arasındaki port eşlemelerivolumes
: Host makine ile container arasındaki volume eşlemelerienvironment
: Container içindeki ortam değişkenleri
Docker Compose Kullanımı:
- Bir
docker-compose.yml
dosyası oluşturun. - Dosyanın bulunduğu dizinde aşağıdaki komutu çalıştırın:
docker-compose up -d
up
: Uygulamayı başlatır-d
: Arka planda çalıştırır
- Uygulamayı durdurmak için:
docker-compose down
Docker Hub Nedir? İmaj Yayınlama ve Çekme İşlemleri
Docker Hub, Docker imajlarını saklamak ve paylaşmak için kullanılan bir bulut tabanlı registry servisidir. Geliştiriciler, Docker Hub'ı kullanarak kendi imajlarını yayınlayabilir ve başkalarının imajlarını çekebilirler. Docker Hub, hem herkese açık (public) hem de özel (private) imaj depolarını destekler.
Docker Hub Kullanımı:
- Bir Docker Hub hesabı oluşturun.
- Terminalinizde Docker Hub hesabınıza giriş yapın:
docker login
- Kendi imajınızı oluşturun veya mevcut bir imajı etiketleyin:
docker tag my-app username/my-app:v1
my-app
: Mevcut imajın adıusername
: Docker Hub kullanıcı adınızmy-app:v1
: Yeni imajın adı ve etiketi
- İmajı Docker Hub'a gönderin:
docker push username/my-app:v1
- Başka bir imajı çekmek için:
docker pull username/other-app:latest
Docker ile İlgili Güvenlik Konuları ve En İyi Uygulamalar
Docker kullanırken güvenlik, önemli bir konudur. İşte dikkat edilmesi gereken bazı güvenlik konuları ve en iyi uygulamalar:
- Temel İmaj Güvenliği: Güvenilir ve güncel temel imajlar kullanın. Docker Hub'da resmi ve doğrulanmış imajları tercih edin.
- İmaj Tarama: İmajlarınızı güvenlik açıkları için düzenli olarak tarayın. Docker Hub, otomatik imaj tarama özellikleri sunar. Ayrıca, Clair gibi üçüncü taraf araçları da kullanabilirsiniz.
- Kullanıcı Yetkilendirmesi: Container'ları root kullanıcısı olarak çalıştırmaktan kaçının. Mümkünse, özel bir kullanıcı oluşturun ve container'ı bu kullanıcı altında çalıştırın.
- Kaynak Sınırlamaları: Container'ların kullanabileceği CPU, bellek ve disk gibi kaynakları sınırlayın. Bu, bir container'ın aşırı kaynak tüketmesini ve diğer container'ları etkilemesini önler.
- Ağ Güvenliği: Container'lar arasındaki iletişimi sınırlandırın. Docker ağlarını kullanarak, container'ları izole edebilir ve sadece gerekli container'ların birbirleriyle iletişim kurmasına izin verebilirsiniz.
- Gizli Bilgilerin Yönetimi: API anahtarları, şifreler ve sertifikalar gibi gizli bilgileri container'ların içine doğrudan gömmekten kaçının. Docker Secrets veya HashiCorp Vault gibi araçları kullanarak, gizli bilgileri güvenli bir şekilde yönetebilirsiniz.
- Dockerfile Güvenliği: Dockerfile'larınızda gereksiz paketleri yüklemekten kaçının. Ayrıca,
COPY
komutunu kullanırken, sadece gerekli dosyaları kopyalayın. - Güncel Kalın: Docker ve ilgili araçları düzenli olarak güncelleyin. Güvenlik açıkları genellikle güncellemelerle giderilir.
Güvenlik Konusu | En İyi Uygulama | Araçlar/Teknikler |
---|---|---|
Temel İmaj Güvenliği | Güvenilir ve güncel imajlar kullanın | Resmi imajlar, Doğrulanmış imajlar |
İmaj Tarama | Güvenlik açıkları için imajları tarayın | Docker Hub otomatik tarama, Clair |
Kullanıcı Yetkilendirmesi | Container'ları root olmayan kullanıcı olarak çalıştırın | USER komutu |
Kaynak Sınırlamaları | CPU, bellek ve disk kullanımını sınırlayın | docker run --cpus , --memory |
Ağ Güvenliği | Container'lar arasındaki iletişimi sınırlandırın | Docker ağları |
Gizli Bilgi Yönetimi | Gizli bilgileri güvenli bir şekilde yönetin | Docker Secrets, HashiCorp Vault |