Docker: Görüntüler (Images) ve Kapsayıcılar (Containers) — Tiffin Kutuları ve Çayla Anlatım
Docker dünyasına dalmak heyecan verici, ancak Images ve Containers arasındaki farkı anlamak çoğu zaman kafa karıştırıcı olabiliyor. Bu makalede, tıpkı lezzetli bir tiffin kutusunun yemekleri ve chai’nin sıcaklığını içermesi gibi, Docker Images’larının ve Containers’larının arasındaki ilişkiyi adım adım, gerçek dünya örnekleriyle açıklayacağız. Docker’ın temellerini kavrayarak, uygulamalarınızı daha verimli ve güvenilir bir şekilde yönetebilirsiniz.
Docker Images: Tarif Kitabı Gibi
Bir Docker Image, uygulamanızın çalışması için gereken her şeyi içeren bir şablondur. Bu, işletim sistemi dosyalarını, kütüphaneleri, bağımlılıkları ve uygulamanızın kodunu kapsar. Bir yemek kitabındaki bir tarif gibi düşünün; tarif, yemeği yapmak için gerekli olan tüm malzemeleri ve adımları açıkça belirtir. Image ise, uygulamanızı çalıştırmak için gereken tüm bileşenleri içeren “tarif”tir. Bir Image oluşturmak için Dockerfile adı verilen bir dosya kullanırsınız. Bu dosya, image’ın nasıl oluşturulacağını adım adım tanımlar. Örneğin, bir web uygulamanız için bir image oluşturmak için, öncelikle işletim sistemini (örneğin, Ubuntu), ardından web sunucusunu (örneğin, Apache veya Nginx), ardından da uygulamanızın kodunu kurmanız gerekecektir. Bu adımlar Dockerfile içinde sıralanır ve docker build komutu ile image oluşturulur.
Bir Image, yalnızca okunur (read-only) bir katmandır. Bu, Image’ın değiştirilemeyeceği anlamına gelir. Bu özellik, tutarlılık ve güvenilirlik sağlar. Birçok image aynı temel image’lardan türetilebilir, bu da depolama alanından ve zaman kazandırır. Örneğin, bir Python uygulaması için bir image oluşturmak istiyorsanız, Python tabanlı bir image’ı temel alabilir ve ardından kendi uygulamanızın kodunu ekleyebilirsiniz. Bu, tekerleği yeniden icat etmek zorunda kalmamanız anlamına gelir.
Örnek Senaryo: Bir e-ticaret uygulaması için bir Docker Image oluşturalım. Bu Image, Apache web sunucusu, MySQL veritabanı, PHP ve e-ticaret uygulamasının kodunu içerecektir. Dockerfile, bu bileşenlerin kurulum adımlarını belirtir ve docker build komutu ile image oluşturulur. Bu Image, daha sonra her hangi bir Docker ortamında çalıştırılabilir.
Docker Containers: Yemeğin Kendisi
Bir Docker Container, bir Docker Image’dan oluşturulan çalıştırılabilir bir örnektir. Yemek kitabındaki tariften yaptığınız yemeği düşünün; Container, bu yemeğin kendisidir. Bir Image’ı çalıştırmak için docker run komutunu kullanırsınız. Bu komut, Image’ı bir Container olarak başlatır ve uygulamanızı çalıştırır. Container’lar, Image’dan türetilmiş olsa da, yazma yeteneğine (read-write) sahiptirler. Bu, Container’ların çalışırken değiştirilebileceği anlamına gelir. Örneğin, bir Container içinde dosya ekleyebilir, silebilir veya güncelleyebilirsiniz. Ancak bu değişiklikler, Image’ı etkilemez. Her bir Container, kendi izole edilmiş ortamında çalışır. Bu, Container’lar arasında bağımsız çalışabilir ve bir Container’daki sorun diğerlerini etkilemez.
Container’lar kaynakları verimli bir şekilde kullanır. Her Container, kendi sanal dosya sistemine ve ağ bağlantılarına sahip olsa da, aynı ana bilgisayarın kaynaklarını paylaşır. Bu, aynı makinede birçok Container’ı çalıştırmanıza olanak tanır, kaynakların verimli kullanımı sağlanır. Aynı zamanda, Container’ları kolayca durdurabilir, başlatabilir, silebilir ve kopyalayabilirsiniz. Bu da yönetimi oldukça kolaylaştırır.
Örnek Senaryo: Yukarıda oluşturduğumuz e-ticaret uygulaması Image’ını bir Container olarak çalıştırmak için docker run komutunu kullanırız. Bu, e-ticaret uygulamasının çalışmaya başlamasını sağlar. Daha sonra, Container’ı durdurabilir, başlatabilir veya silebiliriz.
Images ve Containers Arasındaki Temel Farklar
| Özellik | Image | Container |
|---|---|---|
| Tanım | Uygulamanın çalışması için gereken tüm bileşenleri içeren bir şablon. | Bir Image’dan oluşturulan çalıştırılabilir bir örnek. |
| Yazma Yeteneği | Yalnızca okunur (read-only). | Yazılabilir (read-write). |
| Durum | Statik. | Dinamik. |
| Kaynak Kullanımı | Disk alanını kullanır. | CPU, bellek ve diğer kaynakları kullanır. |
| İşlemler | Oluşturulur, depolanır ve paylaşılır. | Çalıştırılır, durdurulur ve silinir. |
Dockerfile: Image Oluşturma Süreci
Dockerfile, bir Docker Image’ı oluşturmak için kullanılan bir metin dosyasıdır. Bu dosya, Image’ın oluşturulması için gereken adımları adım adım tanımlar. FROM komutu ile bir temel Image seçilir ve ardından COPY, RUN, CMD gibi komutlarla Image özelleştirilir. Örneğin, bir Node.js uygulaması için bir Dockerfile aşağıdaki gibi olabilir:
FROM node:16
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD [ "npm", "start" ]
Bu Dockerfile, Node.js sürüm 16'yı temel Image olarak seçer, uygulamanın kodunu kopyalar, bağımlılıkları yükler ve uygulamayı 3000 portunda çalıştırır. docker build komutu ile bu Dockerfile'dan bir Image oluşturulur.
Docker Hub: Image Deposu
Docker Hub, Docker Images'larını depolamak ve paylaşmak için kullanılan bir bulut tabanlı bir hizmettir. Tıpkı bir yemek tarifi web sitesi gibi, Docker Hub, kullanıcıların oluşturdukları Images’ları paylaşmalarına ve başkalarının bu Images’ları kullanmalarına olanak tanır. Bu, tekerleği yeniden icat etmek zorunda kalmadan, önceden oluşturulmuş Images’ları kullanarak zaman ve çaba kazanmanıza yardımcı olur. Docker Hub'da birçok farklı Image mevcuttur; popüler programlama dilleri, veritabanları, web sunucuları ve daha fazlası için önceden oluşturulmuş Images'lar bulabilirsiniz. Kendi Images’larınızı da Docker Hub’da paylaşabilirsiniz.
Gerçek Dünya Senaryoları ve Vaka Çalışmaları
Senaryo 1: Web Uygulaması Dağıtımı: Bir web uygulaması geliştirdiniz ve bunu sunucunuza dağıtmanız gerekiyor. Docker kullanarak, uygulamanızı ve tüm bağımlılıklarını bir Image'a paketleyebilir ve bu Image'ı herhangi bir sunucuya kolayca dağıtabilirsiniz. Bu, farklı ortamlar arasında tutarlılığı sağlar ve dağıtım sürecinizi basitleştirir.
Senaryo 2: Mikroservis Mimarisi: Bir mikroservis mimarisi kullanarak uygulamanızı farklı servislerden oluşturduğunuzu varsayalım. Her servis için ayrı bir Docker Image oluşturabilir ve bunları bağımsız olarak yönetebilirsiniz. Bu, uygulamanızın ölçeklenebilirliğini ve yönetilebilirliğini artırır.
Senaryo 3: Veritabanı Yönetimi: Veritabanınızı bir Docker Container'ında çalıştırarak, veritabanınızı diğer uygulamalardan izole edebilir ve kolayca yedekleyebilir, geri yükleyebilir ve güncelleyebilirsiniz.
İleri Düzey Konular: Docker Compose ve Orchestration
Docker Compose, birden çok Container'ı yönetmek için kullanılır. Bir docker-compose.yml dosyası oluşturarak, farklı Container'lar arasındaki bağımlılıkları ve yapılandırmaları tanımlayabilirsiniz. Bu, karmaşık uygulamaların yönetimini büyük ölçüde kolaylaştırır. Docker Swarm veya Kubernetes gibi orkestrasyon araçları, büyük ölçekli Docker uygulamalarının yönetimini otomatikleştirmek için kullanılır. Bu araçlar, Container'ların dağıtımını, ölçeklenmesini ve izlenmesini otomatikleştirerek büyük ve karmaşık uygulamaları yönetmeyi kolaylaştırır.
Sonuç
Docker Images ve Containers, uygulamalarınızı geliştirmek, dağıtmak ve yönetmek için güçlü bir araçtır. Images, uygulamalarınızın yapı taşları iken, Containers, bu yapı taşlarını çalıştırılabilir bir halde getirir. Docker’ın sunduğu avantajlardan tam olarak faydalanmak için, bu temel kavramları ve aralarındaki ilişkiyi anlamak önemlidir. Daha fazla bilgi için fatihsoysal.com sitesini ziyaret edebilirsiniz.
Sıkça Sorulan Sorular
- Soru: Bir Image'ı sildikten sonra, ondan oluşturulan Container'lar ne olur?
- Cevap: Container'lar çalışmaya devam eder, ancak yeni Container'lar oluşturulamaz.
- Soru: Bir Image'ı nasıl güncellerim?
- Cevap: Yeni bir Image oluşturup eski Image'ı silmeniz gerekir. Container'ları da güncellenmiş Image ile yeniden oluşturmanız gerekebilir.
- Soru: Docker Hub hesabım olmadan Image paylaşabilir miyim?
- Cevap: Hayır, Docker Hub bir depolama alanı sağlar, paylaşım için gereklidir.
- Soru: Docker, sanal makinelere göre nasıl bir avantaja sahiptir?
- Cevap: Docker, sanal makinelere göre daha hafif ve hızlıdır, kaynakları daha verimli kullanır ve daha hızlı dağıtım sağlar.
Yazar: Fatih Soysal
