Docker ve Sanal Makineler Arasındaki Farkları Anlamak

Nodejs

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: 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: Sonraki komutların belirtilen dizinde yürütülmesini sağlayan komut. 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. komut ve son olarak 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: komutunu burada Ubuntu 20.04 kullanarak kullanıyorum. Ağ ayarları kullanılarak yapılandırılır. 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. 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.

  1. Docker ve VM'ler arasındaki temel fark nedir?
  2. 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.
  3. Docker konteynerlerinin neden daha verimli olduğu düşünülüyor?
  4. 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.
  5. Docker dosya sistemi izolasyonunu nasıl başarır?
  6. 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.
  7. VM'ler bağlamında hipervizör nedir?
  8. 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.
  9. Docker ağ izolasyonunu nasıl ele alıyor?
  10. Docker, her kapsayıcı için yalıtılmış ağ ortamları sağlamak amacıyla ad alanlarını kullanır.
  11. Yazılımı Docker görüntüsüne dağıtmak neden VM'den daha kolay?
  12. Docker görüntüleri tüm bağımlılıkları ve yapılandırmaları kapsayarak farklı ortamlarda tutarlılık sağlar.
  13. Docker'ın bazı yaygın kullanım durumları nelerdir?
  14. 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.
  15. Docker kapsayıcıları herhangi bir işletim sisteminde çalışabilir mi?
  16. Docker kapsayıcıları, Docker'ı destekleyen herhangi bir işletim sistemi üzerinde çalışabilir ancak ana işletim sistemi çekirdeğini paylaşırlar.
  17. Docker'da temel görüntü nedir?
  18. 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.

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.