Docker, nedir ve amacı nedir


111

Docker'ı birkaç gün önce duydum ve karşıya geçmek istedim.

Ama aslında, bu "konteynerin" amacının ne olduğunu bilmiyorum?

Konteyner nedir?

Geliştirmeye adanmış bir sanal makinenin yerini alabilir mi?

Basit bir deyişle, şirketlerde Docker kullanmanın amacı nedir? Asıl avantajı?



Yanıtlar:


116

VM: Örneğin, VM yazılımını kullanarak, Ubuntu bir Windows içine kurulabilir. Ve ikisi de aynı anda koşacaktı. Bir işletim sistemi içinde CPU, RAM, Diskler, Ağ Kartları vb. Gibi temel bileşenleri olan bir PC oluşturmak ve bunları gerçek bir PC gibi çalışmak üzere bir araya getirmek gibidir. Bu şekilde, sanal bilgisayar, işletim sistemiyle birlikte ana bilgisayar olarak adlandırılan gerçek bir bilgisayarın içinde "konuk" olur.

Kapsayıcı: Yukarıdaki ile aynıdır, ancak tüm bir işletim sistemini kullanmak yerine, minimum bir sürümünü oluşturmak için sanal işletim sisteminin "gereksiz" bileşenlerini keser. Bu, LXC'nin (Linux Kapsayıcıları) oluşturulmasına yol açar. VM Makinelerden daha hızlıdır.

Docker: Sanal makine ve konteynerden farklı olarak bir docker container, ayrı bir işletim sistemi gerektirmez veya içermez. Bunun yerine, Linux çekirdeğinin işlevselliğine dayanır ve kaynak izolasyonunu kullanır.
Docker'ın Amacı: Birincil odak noktası, yazılım kapsayıcıları içindeki uygulamaların dağıtımını ve Linux'ta işletim sistemi düzeyinde sanallaştırmanın otomasyonunu otomatik hale getirmektir. Standart Container'lardan daha hafiftir ve saniyeler içinde açılır. ggg

(Docker durumunda Konuk İşletim Sistemi gerekmediğine dikkat edin)


1
Liman işletmecisinin geliştirme-dağıtım iş akışıyla ilgili kaynakları aramayı denedim, ancak hiçbir şey bulamıyorum. Örneğin, laravel + angular4 ile bir lampp ortamım olduğunu verelim. Takım arkadaşlarımla belirli bir dosyayı paylaşıyor muyum? Uygulama kaynağını (php html js / ts) bir kap içine koyarsam nasıl düzenlerim? Kaynak kodumuzda hala git / svn kullanabilir miyiz?
anaval

13
VM, "Sanal makine" anlamına gelir. "VM Machine" demenize gerek yok çünkü o zaman "Sanal makine makinesi" olur. :)
Dzhuneyt

32

[Not, bu yanıt Linux kapsayıcılarına odaklanır ve diğer işletim sistemleri için tam olarak geçerli olmayabilir. ]

Konteyner nedir?

Bu bir Uygulama : Bir konteyner, birbirinden izole edilmiş uygulamaları çalıştırmanın bir yoludur. Donanımı birden çok işletim sistemini çalıştırmak için sanallaştırmak yerine, kapsayıcılar birden çok uygulamayı çalıştırmak için işletim sistemini sanallaştırmaya dayanır. Bu, aynı donanım üzerinde VM'lerden daha fazla kapsayıcı çalıştırabileceğiniz anlamına gelir çünkü çalışan işletim sisteminin yalnızca bir kopyası vardır ve uygulamanızın her bir örneği için bellek ve CPU çekirdeklerini önceden tahsis etmeniz gerekmez. Tıpkı diğer uygulamalar gibi, bir konteyner CPU veya Belleğe ihtiyaç duyduğunda, bunları ayırır ve bittiğinde bunları serbest bırakır ve diğer uygulamaların aynı sınırlı kaynakları daha sonra kullanmasına izin verir.

Çekirdek ad alanlarından yararlanırlar : Her konteyner varsayılan olarak aşağıdakilerin ad alanlı olduğu bir ortam alır:

  • Bağla: /kapsayıcıdaki dosya sistemleri, /ana bilgisayardakinden farklı olacaktır .
  • PID: işlem kimlikleri, konteynırdaki pid 1 başlatılan uygulamanızdır, bu pid ana bilgisayardan görüntülendiğinde farklı olacaktır.
  • Ağ: konteynerler, varsayılan olarak kendi geri döngü arayüzleri (127.0.0.1) ve özel bir IP ile çalışır. Docker, birden çok kapsayıcıyı kendi özel lanında birbirine bağlamak için Linux köprü ağları gibi teknolojileri kullanır.
  • IPC: işlemler arası iletişim
  • UTS: bu, ana bilgisayar adını içerir
  • Kullanıcı: İsteğe bağlı olarak, tüm kullanıcı kimliklerini ana bilgisayarınkinden uzak olacak şekilde değiştirebilirsiniz.

Bu ad alanlarının her biri, siz bu yalıtımı açıkça kaldırmadığınız sürece, bir kapsayıcının dosya sistemi veya ana bilgisayardaki veya diğer kapsayıcılardaki işlemler gibi şeyleri görmesini de engeller.

Ve diğer Linux güvenlik araçları : Kapsayıcılar ayrıca SELinux, AppArmor, Capabilities ve Seccomp gibi diğer güvenlik özelliklerini kullanarak, kapsayıcı içindeki kök kullanıcı da dahil olmak üzere kullanıcıların kapsayıcıdan kaçmasını veya ana bilgisayarı olumsuz etkilemesini sınırlar.

Uygulamalarınızı taşınabilirlik için bağımlılıkları ile paketleyin : Bir uygulamayı bir kapsayıcıda paketlemek, yalnızca uygulamanın kendisini değil, aynı zamanda bu uygulamayı çalıştırmak için gereken tüm bağımlılıkları taşınabilir bir görüntüde birleştirmeyi içerir. Bu görüntü, bir kapsayıcı oluşturmak için kullanılan temel dosya sistemidir. Yalnızca uygulamayı izole ettiğimiz için, bu dosya sistemi tüm bir işletim sistemini sanallaştırmak için gerekli olan çekirdeği ve diğer işletim sistemi yardımcı programlarını içermez. Bu nedenle, bir kapsayıcı için bir görüntü, eşdeğer bir sanal makine için olan bir görüntüden önemli ölçüde daha küçük olmalıdır ve bu, ağdaki düğümlere dağıtılmasını daha hızlı hale getirir. Sonuç olarak konteynerler, uygulamaları buluta ve uzak veri merkezlerine dağıtmak için popüler bir seçenek haline geldi.

Geliştirmeye adanmış bir sanal makinenin yerini alabilir mi?

Şuna bağlıdır : Geliştirme ortamınız Linux çalıştırıyorsa ve donanım cihazlarına erişmeniz gerekmiyorsa veya fiziksel donanıma doğrudan erişiminiz kabul edilebilirse, o zaman bir Linux kapsayıcısına geçişi oldukça basit bulursunuz. Docker container için ideal hedef, ağ üzerinden eriştiğiniz web tabanlı API'ler (örneğin bir REST uygulaması) gibi uygulamalardır.

Basit bir deyişle, şirketlerde Docker kullanmanın amacı nedir? Asıl avantajı ?

Dev veya Ops : Docker, genellikle iki yoldan birinde bir ortama getirilir. Uygulamalarını daha hızlı geliştirmenin ve yerel olarak test etmenin bir yolunu arayan geliştiriciler ve daha az donanım üzerinde sanal makinelerde mümkün olandan daha fazla iş yükü çalıştırmayı amaçlayan işlemler.

Veya Devops : İdeal hedeflerden biri, Docker'ı CI / CD dağıtım aracından hemen kullanmak, uygulamayı derlemek ve geliştirme, CI, prod vb. İçin dağıtılan bir imajı hemen oluşturmaktır. Konteynerler genellikle uygulamayı taşıma süresini azaltır kod girişinden test için hazır olana kadar, geliştiricileri daha verimli hale getirir. Doğru tasarlandığında, geliştiriciler ve CI araçları tarafından test edilen ve onaylanan aynı görüntü üretimde kullanılabilir. Bu görüntü tüm uygulama bağımlılıklarını içerdiğinden, geliştirme aşamasında işe yarayan bir şeyin üretimde kırılma riski önemli ölçüde azalır.

Ölçeklenebilirlik : Bahsedeceğim kapsayıcıların son bir önemli faydası, yatay ölçeklenebilirlik göz önünde bulundurularak tasarlanmış olmalarıdır. Ağır yük altında durum bilgisi olmayan uygulamalarınız olduğunda, daha küçük görüntü boyutları ve azaltılmış ek yükleri nedeniyle kapsayıcıların ölçeklendirilmesi çok daha kolay ve daha hızlıdır. Bu nedenle, kapsayıcıların Google ve Netflix gibi birçok büyük web tabanlı şirket tarafından kullanıldığını görüyorsunuz.


2
+1 Cevabınıza, özellikle "sanal makinelerin yerini alabilir mi" bölümüne tamamen katılıyorum. Başka yerlerde Docker'ın bir Sanal Makine olmadığını vurgulayan birçok yorum görüyorum, ancak deneyimlerime göre, birçok kullanım durumu için aynı şekilde çalışıyor veya daha iyi bir alternatif. "Fiziksel donanıma doğrudan erişim için kabul edilebilir" derken neyi kastediyorsunuz?
Tyress

2
Ana makineniz Linux ise @tyress, aygıtları doğrudan bir Linux kapsayıcısına bağlayabilirsiniz. Ses cihazlarıyla yapıldığını gördüm, ancak / dev içindeki herhangi bir şey eklenebilir. Bu, bazı kapsayıcı izolasyonlarını atlar, ancak masaüstü uygulamaları gibi belirli görevler için mantıklıdır.
BMitch

harika. Ben bunu düşünmedim.
Tyress

@BMitch: çok temiz ve zarif bir cevap, teşekkürler !! Sanırım artık konteynerin ne olduğunu görselleştirebilirim .. ancak cevabınızı konteynerin docker ile nasıl ilişkili olduğu konusunda güncellerseniz harika olur mu? Container ve VM karşılaştırıldığında, docker hipervizörle eşdeğer midir?
rahulaga_dev

1
Docker, kapsayıcıları uygulayan ve Linux kapsayıcılarını çalıştırmak için bir sanal makineyi yerleştiren docker hub ve masaüstü ortamlarındaki kayıt defteri gibi ihtiyaç duyulan ekosistemin geri kalanını sağlayan bir araçtır.
BMitch

6

Birkaç gün önce aynı sorular kafama çarpıyordu ve içine girdikten sonra bulduğum şeyi çok basit kelimelerle anlayalım.

Mevcut uygulama mimarisi ve geliştirme sürecinde her şey yolundayken neden docker ve container'lar düşünülür?

NodeJs, MongoDB, Redis, RabbitMQ vb. Hizmetleri kullanarak bir uygulama geliştirdiğimizi bir örnek olarak ele alalım [diğer hizmetleri düşünebilirsiniz].

Şimdi , docker varlığını veya konteynerleştirme uygulamalarının diğer alternatiflerini unutursak , aşağıdaki şeylerle uygulama geliştirme ve nakliye sürecindeki sorunlar olarak karşı karşıyayız .

  1. Hizmetlerin (nodeJs, mongoDB, Redis, RabbitMQ vb.) İşletim sistemi ile uyumluluğu ( işletim sistemi ile uyumlu sürümler bulduktan sonra bile, sürümlerle ilgili beklenmedik bir şey olursa, uyumluluğu yeniden gözden geçirip düzeltmemiz gerekir).

  2. İki sistem bileşeni , işletim sistemindeki uygulamada farklı sürümlere sahip bir kitaplık / bağımlılık gerektiriyorsa (Kitaplık ve bağımlılık sürüm sorunu nedeniyle uygulamanın beklenmedik bir davranışı durumunda her seferinde yeniden bakılması gerekir).

  3. En önemlisi, eğer ekibe yeni bir kişi katılırsa, yeni ortamı kurmayı çok zor buluyoruz, kişinin geniş talimat setini takip etmesi gerekiyor. nihayet ve yüzlerce komut çalıştırması gerekiyor Ve bu zaman ve çaba gerektiriyor.

    İnsanlar doğru işletim sistemi sürümünü kullandıklarından emin olmalı ve hizmetlerin işletim sistemi ile uyumluluğunu kontrol etmelidir ve her geliştirici kurulum sırasında her seferinde bunu takip etmelidir.

  4. Ayrıca geliştirme , test ve üretim gibi farklı ortamlarımız var . Bir geliştirici bir işletim sistemini rahatça kullanırken diğeri diğer işletim sistemlerinde rahatsa ve bu durumda, uygulamamızın bu iki farklı durumda aynı şekilde davranacağını garanti edemeyiz. .

Tüm bunlar , uygulamaları geliştirme , test etme ve gönderme sürecinde hayatımızı zorlaştırıyor .

Bu nedenle , uyumluluk sorununu ele alan ve diğer bileşenleri etkilemeden herhangi bir sistem bileşeninde değişiklik ve modifikasyonlar yapmamıza izin veren bir şeye ihtiyacımız var .

Şimdi docker'ı düşünüyoruz, çünkü amacı uygulamaları kapsayıcı hale getirmek ve uygulamaların dağıtımını otomatikleştirmek ve çok kolay bir şekilde göndermek.

görüntü açıklamasını buraya girin

Docker yukarıdaki sorunları nasıl çözer?

  1. Her bir hizmet bileşenini (nodeJs, MongoDB, Redis, RabbitMQ) aynı işletim sisteminde ancak farklı ortamlarda kendi bağımlılıkları ve kitaplıkları olan farklı konteynerlerde çalıştırabiliriz .

  2. Docker yapılandırmasını sadece bir kez çalıştırmalıyız, ardından tüm ekip geliştiricilerimiz basit docker run komutuyla başlayabilir, burada çok fazla zaman ve emekten tasarruf ettik :) .

Dolayısıyla, kapsayıcılar , tüm bağımlılıkları ve kitaplıkları kendi süreçleri ve ağ arabirimleri ve bağlantılarıyla birlikte paketlenmiş yalıtılmış ortamlardır. .

Tüm kapsayıcılar aynı işletim sistemi kaynaklarını kullanır, bu nedenle önyükleme yapmak ve CPU'yu daha az donanım maliyetiyle verimli bir şekilde kullanmak için daha az zaman harcarlar.

Umarım bu yardımcı olur.


2

Mümkün olduğunca basit cevaplar vermeye çalışayım:

Ama aslında, bu "konteynerin" amacının ne olduğunu bilmiyorum?

Konteyner nedir?

Basitçe söylemek gerekirse: yazılım içeren bir paket . Daha spesifik olarak, bir uygulama ve tüm bağımlılıkları birlikte paketlenmiştir. Docker kapsayıcısı bir işletim sistemi soyutlama katmanı iken, dockerize olmayan normal bir uygulama ortamı doğrudan işletim sistemine bağlanır.

Ve kap bir görüntüden farklıdır, çünkü bir kap bir görüntünün çalışma zamanı örneğidir - nesnelerin, OOP'ye aşina olmanız durumunda sınıfların çalışma zamanı örnekleri olmasına benzer.

Geliştirmeye adanmış bir sanal makinenin yerini alabilir mi?

Hem VM'ler hem de Docker kapsayıcıları, sistem altyapısının üzerinde soyutlama sağladıkları için sanallaştırma teknikleridir.

Bir VM, bir hiper yönetici aracılığıyla ana bilgisayar kaynaklarına sanal erişime sahip tam bir "konuk" işletim sistemi çalıştırır. Bu, sanal makinenin genellikle ortama gerçekte ihtiyaç duyduğundan daha fazla kaynak sağladığı anlamına gelir. Genel olarak, VM'ler çoğu uygulamanın ihtiyaç duyduğundan daha fazla kaynak içeren bir ortam sağlar. Bu nedenle, kaplar daha hafif bir tekniktir. İkisi farklı sorunları çözer.

Basit bir deyişle, şirketlerde Docker kullanmanın amacı nedir? Asıl avantajı?

Containerisation, mikro hizmetlerle el ele gider. Daha büyük uygulamayı oluşturan daha küçük hizmetler genellikle test edilir ve Docker konteynerlerinde çalıştırılır. Bu, sürekli testi kolaylaştırır.

Ayrıca Docker kapsayıcıları salt okunur olduğu için önemli bir DevOps ilkesini uygularlar: üretim hizmetleri değiştirilmeden kalmalıdır

Bunları kullanmanın bazı genel faydaları:

  • Hizmetlerin mükemmel izolasyonu
  • Kapsayıcılar uygulamanın ihtiyaç duyduğu her şeyi içerdiğinden mükemmel yönetilebilirlik
  • Uygulama teknolojisinin kapsüllenmesi (kaplarda)
  • VM'lere kıyasla verimli kaynak kullanımı (hafif işletim sistemi sanallaştırması nedeniyle)
  • Hızlı dağıtım
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.