Docker ve Sanal Makinelere Giriş
Docker ve sanal makineler (VM'ler), uygulamaları dağıtmak için kullanılan popüler araçlardır ancak temelde farklı şekillerde çalışırlar. Pek çok geliştirici, Docker'ın eksiksiz bir dosya sistemi, yalıtılmış ağ iletişimi ve diğer özellikleri, genellikle VM'lerle ilişkili ek yük olmadan nasıl sağlayabildiği konusunda şaşkın buluyor.
Bu makale, Docker ile geleneksel sanal makineler arasındaki farkları açıklığa kavuşturmayı amaçlıyor ve Docker'ın neden genellikle daha hafif ve yazılım dağıtımı açısından daha kolay kabul edildiğini açıklıyor. Docker'ı üretim ortamlarında kullanmanın temel teknolojilerini ve pratik faydalarını inceleyeceğiz.
Emretmek | Tanım |
---|---|
FROM | Docker kapsayıcısı oluşturmak için kullanılacak temel görüntüyü belirtir. |
WORKDIR | Docker kapsayıcısının içindeki çalışma dizinini ayarlar. |
COPY | Dosyaları veya dizinleri ana makineden Docker kapsayıcısına kopyalar. |
RUN | Derleme işlemi sırasında Docker kapsayıcısında bir komut yürütür. |
EXPOSE | Docker'a kapsayıcının çalışma zamanında belirtilen ağ bağlantı noktalarını dinlediğini bildirir. |
CMD | Docker kapsayıcısı başlatıldığında içinde çalıştırılacak komutu belirtir. |
config.vm.box | Vagrant sanal makinesi için kullanılacak temel kutuyu tanımlar. |
config.vm.network | Bağlantı noktalarının ana bilgisayardan VM'ye iletilmesi gibi ağ ayarlarını yapılandırır. |
config.vm.provision | Kurulum sırasında kabuk komut dosyalarının çalıştırılması gibi sanal makinenin nasıl sağlanacağını belirtir. |
Dockerfile ve Vagrantfile'ı keşfetme
Verilen örneklerde ilk olarak bir Node.js uygulamasını dağıtmak için Dockerfile'ın nasıl oluşturulacağını gösterdik. Dockerfile, temel görüntüyü şu şekilde belirleyerek başlar: FROM Bu durumda resmi bir Node.js çalışma zamanı kullanılarak komut. Kabın içindeki çalışma dizininin ayarlanması şu şekilde gerçekleştirilir: WORKDIR Sonraki komutların belirtilen dizinde yürütülmesini sağlayan komut. COPY komutu package.json dosyalarını ve uygulama kodunu konteynere aktarmak için kullanılır. RUN komut daha sonra gerekli bağımlılıkları kabın içine yükler. Uygulamanın çalıştığı bağlantı noktasını kullanarak gösteririz. EXPOSE komut ve son olarak CMD command, konteyner başlatıldığında uygulamayı çalıştıracak komutu tanımlar.
Vagrantfile örneği için konfigürasyon, temel kutunun şu şekilde belirtilmesiyle başlar: config.vm.box komutunu burada Ubuntu 20.04 kullanarak kullanıyorum. Ağ ayarları kullanılarak yapılandırılır. config.vm.network Ana makinedeki 8080 numaralı bağlantı noktasını konuk VM üzerindeki 80 numaralı bağlantı noktasına ileten komut, VM üzerinde çalışan hizmetlere harici erişime izin verir. config.vm.provision komutu, paket listesini güncelleyen ve Apache2'yi kurarak VM'ye gerekli yazılımı sağlayan bir kabuk betiğini çalıştırmak için kullanılır. Bu komutlar, Docker tarafından sağlanan kapsayıcı ortama kıyasla daha geleneksel bir yaklaşım sunarak bir VM ortamı kurmanın temel adımlarını sergiliyor.
Node.js Uygulama Dağıtımı için Dockerfile Oluşturma
Bu örnek, bir Node.js uygulaması için Docker dosyasının nasıl oluşturulacağını gösterir ve uygulamayı bir Docker kapsayıcısı içinde oluşturma ve çalıştırma adımlarını gösterir.
# Use an official Node.js runtime as a parent image
FROM node:14
# Set the working directory inside the container
WORKDIR /usr/src/app
# Copy package.json and package-lock.json to the container
COPY package*.json ./
# Install the application dependencies inside the container
RUN npm install
# Copy the rest of the application code to the container
COPY . .
# Expose the port the app runs on
EXPOSE 8080
# Define the command to run the app
CMD ["node", "app.js"]
Vagrant Kullanarak Sanal Makine Kurma
Bu örnek, basit bir Vagrant dosyasıyla Vagrant kullanarak bir sanal makinenin nasıl kurulacağını gösterir ve bir VM ortamını tanımlama ve yapılandırma sürecini gösterir.
# -*- mode: ruby -*-
# vi: set ft=ruby :
# All Vagrant configuration is done below. The "2" in Vagrant.configure
# configures the configuration version (we support older styles for
# backwards compatibility). Please don't change it unless you know what
# you're doing.
Vagrant.configure("2") do |config|
# Use Ubuntu 20.04 as the base box
config.vm.box = "ubuntu/focal64"
# Forward port 8080 on the host to port 80 on the guest
config.vm.network "forwarded_port", guest: 80, host: 8080
# Provision the VM with a shell script
config.vm.provision "shell", inline: <<-SHELL
sudo apt-get update
sudo apt-get install -y apache2
SHELL
end
Docker ve Sanal Makineleri Anlamak
Docker ile sanal makineler (VM'ler) arasındaki temel ayrımlardan biri, sistem kaynaklarını nasıl kullandıklarında yatmaktadır. VM'ler, donanımı taklit eden ve birden fazla işletim sisteminin bir ana makinede aynı anda çalışmasına izin veren bir hiper yönetici üzerinde çalışır. Bu, her VM'nin tam bir konuk işletim sistemi, kendi kitaplıkları ve ikili dosyaları içermesini gerektirir. Bu yalnızca önemli miktarda sistem kaynağı tüketmekle kalmaz, aynı zamanda dağıtım ve bakımın genel boyutunu ve karmaşıklığını da artırır.
Buna karşılık Docker, birden fazla konteynerin aynı işletim sistemi çekirdeğini paylaşmasına olanak tanıyan konteynerizasyon teknolojisinden yararlanır. Her kapsayıcı, kullanıcı alanında yalıtılmış bir işlem olarak çalışır. Bu, konteynerlerin VM'lere kıyasla çok daha hafif ve daha hızlı başlatılabileceği anlamına geliyor çünkü tüm işletim sistemini başlatmaları gerekmiyor. Docker, her bir kapsayıcının temel görüntünün üzerinde kendi dosya sistemi katmanına sahip olduğu katmanlı bir dosya sistemi aracılığıyla dosya sistemi izolasyonunu gerçekleştirir. Ağ yalıtımı, ad alanları kullanılarak gerçekleştirilir ve Docker'ın, VM'lerle ilişkili ek yük olmadan her konteyner için yalıtılmış ağ ortamları sağlamasına olanak tanır.
Docker ve Sanal Makineler Hakkında Sıkça Sorulan Sorular
- Docker ve VM'ler arasındaki temel fark nedir?
- Docker, ana işletim sistemi çekirdeğini paylaşmak için konteynerleştirmeyi kullanarak onu daha hafif ve daha hızlı hale getirir; VM'ler ise tam bir konuk işletim sistemi ve bir hipervizör gerektirir.
- Docker konteynerlerinin neden daha verimli olduğu düşünülüyor?
- Konteynerler, ana işletim sistemi çekirdeğini paylaşır ve minimum ek yüke sahip olup, daha hızlı başlatma süreleri ve verimli kaynak kullanımına olanak tanır.
- Docker dosya sistemi izolasyonunu nasıl başarır?
- Docker, her bir kapsayıcının temel görüntünün üzerinde kendi dosya sistemi katmanına sahip olduğu katmanlı bir dosya sistemi kullanır.
- VM'ler bağlamında hipervizör nedir?
- Hypervisor, donanımı taklit eden ve birden fazla işletim sisteminin tek bir ana makinede aynı anda çalışmasına izin veren bir yazılımdır.
- Docker ağ izolasyonunu nasıl ele alıyor?
- Docker, her kapsayıcı için yalıtılmış ağ ortamları sağlamak amacıyla ad alanlarını kullanır.
- Yazılımı Docker görüntüsüne dağıtmak neden VM'den daha kolay?
- Docker görüntüleri tüm bağımlılıkları ve yapılandırmaları kapsayarak farklı ortamlarda tutarlılık sağlar.
- Docker'ın bazı yaygın kullanım durumları nelerdir?
- Docker genellikle mikro hizmet mimarisi, sürekli entegrasyon/sürekli dağıtım (CI/CD) ve yalıtılmış geliştirme ortamları için kullanılır.
- Docker kapsayıcıları herhangi bir işletim sisteminde çalışabilir mi?
- Docker kapsayıcıları, Docker'ı destekleyen herhangi bir işletim sistemi üzerinde çalışabilir ancak ana işletim sistemi çekirdeğini paylaşırlar.
- Docker'da temel görüntü nedir?
- Temel görüntü, genellikle işletim sistemi ve temel bağımlılıklar dahil olmak üzere Docker kapsayıcıları oluşturmanın başlangıç noktasıdır.
Docker ve Sanal Makinelerin Özetlenmesi
Docker ve sanal makineleri karşılaştırırken temel fark, kaynak kullanımında ve dağıtım verimliliğinde yatmaktadır. Sanal makineler tam bir konuk işletim sistemi ve hipervizörle çalışır ve bu da daha yüksek kaynak tüketimine yol açar. Tersine, Docker kapsayıcıları ana işletim sistemi çekirdeğini paylaşarak daha hafif ve çevik bir çözüm sağlar. Docker, katmanlı bir dosya sistemi ve ağ ad alanları aracılığıyla yalıtılmış ortamlar elde ederek, VM'lere benzer ek yük olmadan benzer işlevler sunmasına olanak tanır. Bu, yazılımın Docker görüntülerine dağıtılmasını daha verimli, tutarlı ve çeşitli üretim ortamlarında yönetimi daha kolay hale getirir.
Docker ve Sanal Makineler Üzerine Son Düşünceler
Sonuç olarak Docker'ın konteynerleştirme kullanımı, kaynak kullanımını en aza indirerek ve dağıtım süreçlerini basitleştirerek geleneksel sanal makinelere göre önemli bir avantaj sunuyor. Docker, ana işletim sistemi çekirdeğini paylaşarak ve yalıtılmış dosya sistemleri ve ağ iletişimi kullanarak, modern uygulama dağıtımı için sağlam ancak hafif bir çözüm sağlar. Bu farklılıkları anlamak, geliştiricilerin ihtiyaçları için doğru aracı seçmelerine yardımcı olarak verimli ve ölçeklenebilir uygulama yönetimi sağlayabilir.