Docker'ı Anlamak

Web projelerinin geliştirme/teslimat sürecini yapılandırmak için birkaç aydır Docker'ı kullanıyorum. Habrakhabr okuyucularına liman işçisi hakkındaki giriş makalesinin çevirisini sunuyorum - "Liman işçisini anlama".

Liman işçisi nedir?

Docker, uygulamaları geliştirmek, sunmak ve çalıştırmak için açık bir platformdur. Docker, uygulamalarınızı daha hızlı sunmak için tasarlanmıştır. Docker ile uygulamanızı altyapınızdan ayırabilir ve altyapıyı yönetilen bir uygulama gibi değerlendirebilirsiniz. Docker, kodunuzu daha hızlı göndermenize, daha hızlı test etmenize, uygulamaları daha hızlı göndermenize ve kod yazma ile kodu çalıştırma arasındaki süreyi kısaltmanıza yardımcı olur. Docker bunu, uygulamalarınızı yönetmenize ve barındırmanıza yardımcı olan süreçleri ve yardımcı programları kullanarak hafif bir konteyner sanallaştırma platformu aracılığıyla gerçekleştirir.

Docker özünde hemen hemen her uygulamayı bir kapta güvenli bir şekilde izole edilmiş şekilde çalıştırmanıza olanak tanır. Güvenli izolasyon, aynı ana bilgisayar üzerinde aynı anda birçok konteyner çalıştırmanıza olanak tanır. Bir hipervizörün ek yükü olmadan çalışan konteynerin hafif yapısı, donanımınızdan daha fazlasını elde etmenizi sağlar.

Konteyner sanallaştırma platformu ve araçları aşağıdaki durumlarda faydalı olabilir:

  • uygulamanızı (ve kullandığınız bileşenleri) docker konteynerlerinde paketlemek;
  • bu konteynerlerin geliştirme ve test için ekiplerinize dağıtımı ve teslimatı;
  • bu konteynerleri hem veri merkezlerinde hem de bulutlarda üretim sahalarınıza yerleştirebilirsiniz.

Docker'ı ne için kullanabilirim?

Uygulamalarınızı hızla yayınlayın

Docker, geliştirme döngüsünü düzenlemek için mükemmeldir. Docker, geliştiricilerin uygulamalar ve hizmetlerle birlikte yerel kapsayıcıları çalıştırmasına olanak tanır. Bu da daha sonra sürekli entegrasyon ve dağıtım iş akışı sürecine entegre olmanızı sağlar.

Örneğin, geliştiricileriniz kodu yerel olarak yazar ve geliştirme yığınlarını (bir Docker görüntüsü kümesi) meslektaşlarıyla paylaşır. Hazır olduklarında kodu ve kapsayıcıları test sitesine gönderirler ve gerekli testleri çalıştırırlar. Test sitesinden kod ve görselleri üretime gönderebilirler.

Daha kolay yerleştirme ve açma

Liman işçisi konteyner tabanlı platform, yükünüzü taşımayı kolaylaştırır. Docker konteynerleri yerel makinenizde, gerçek veya bir veri merkezindeki sanal makinede veya bulutta çalışabilir.

Docker'ın taşınabilirliği ve hafif yapısı, iş yükünüzü dinamik olarak yönetmenizi kolaylaştırır. Uygulamanızı veya hizmetlerinizi dağıtmak veya kapatmak için docker'ı kullanabilirsiniz. Docker'ın hızı bunun neredeyse gerçek zamanlı olarak yapılmasına olanak tanır.

Daha yüksek yükler ve daha fazla taşıma kapasitesi

Docker hafif ve hızlıdır. Hipervizör tabanlı sanal makinelere dayanıklı, uygun maliyetli bir alternatif sunar. Özellikle yüksek yüklü ortamlarda, örneğin kendi bulutunuzu veya hizmet olarak platformunuzu oluştururken kullanışlıdır. Ancak sahip olduğunuz kaynaklardan daha fazlasını elde etmek istediğinizde küçük ve orta ölçekli uygulamalar için de kullanışlıdır.

Ana Docker Bileşenleri

Docker iki ana bileşenden oluşur:

  • Docker: açık kaynaklı bir sanallaştırma platformu;
  • Docker Hub: Docker konteynerlerini dağıtmaya ve yönetmeye yönelik hizmet olarak platformumuz.

Not! Docker Apache 2.0 lisansı altında dağıtılmaktadır.

Docker mimarisi

Docker istemci-sunucu mimarisini kullanır. Docker istemcisi, konteynerlerinizi oluşturma, çalıştırma ve dağıtma yükünü üstlenen Docker arka plan programıyla iletişim kurar. Hem istemci hem de sunucu aynı sistemde çalışabilir, istemciyi uzak bir docker arka plan programına bağlayabilirsiniz. İstemci ve sunucu, bir soket veya RESTful API aracılığıyla iletişim kurar.

Docker'ı Anlamak

Docker arka plan programı

Diyagramda gösterildiği gibi, arka plan programı ana makinede çalışır. Kullanıcı doğrudan sunucuyla etkileşime girmez ancak bunun için istemciyi kullanır.

Docker istemcisi

Docker istemcisi, yani docker programı, Docker'ın ana arayüzüdür. Kullanıcıdan komutlar alır ve docker arka plan programıyla etkileşime girer.

Liman işçisi içinde

Docker'ın nelerden oluştuğunu anlamak için üç bileşen hakkında bilgi sahibi olmanız gerekir:

  • Görüntüler
  • kayıt
  • Konteynerler

görüntüler

Docker görüntüsü salt okunur bir şablondur. Örneğin, görüntü Apache'nin bulunduğu Ubuntu işletim sistemini ve onun üzerinde bir uygulamayı içerebilir. Görüntüler kapsayıcılar oluşturmak için kullanılır. Docker, yeni görseller oluşturmayı, mevcut görselleri güncellemeyi kolaylaştırır veya başkaları tarafından oluşturulan görselleri indirebilirsiniz. Görüntüler bir liman işçisi yapısının bileşenleridir.

Kaydetmek

Docker kayıt defteri görüntüleri saklar. Görüntüleri indirebileceğiniz veya yükleyebileceğiniz genel ve özel kayıtlar vardır. Herkese açık bir Docker kaydı Docker Hub'ı. Orada saklanan çok büyük bir resim koleksiyonu var. Bildiğiniz gibi görseller sizin tarafınızdan oluşturulabileceği gibi başkalarının oluşturduğu görselleri de kullanabilirsiniz. Kayıtlar bir dağıtım bileşenidir.

Konteynerler

Kapsayıcılar dizinlere benzer. Konteynerler uygulamanın çalışması için ihtiyaç duyduğu her şeyi içerir. Her kapsayıcı bir görüntüden oluşturulur. Kapsayıcılar oluşturulabilir, başlatılabilir, durdurulabilir, taşınabilir veya silinebilir. Her konteyner yalıtılmıştır ve uygulama için güvenli bir platform sağlar. Konteynerler işin bileşenleridir.

Peki Docker nasıl çalışıyor?

Şu ana kadar şunu biliyoruz:

  • uygulamalarımızın bulunduğu görseller oluşturabiliriz;
  • uygulamaları çalıştırmak için görüntülerden kaplar oluşturabiliriz;
  • İmajları Docker Hub veya başka bir imaj kayıt defteri aracılığıyla dağıtabiliriz.

Bu bileşenlerin birbirine nasıl uyduğunu görelim.

Görüntü nasıl çalışır?

Bir görselin, konteynerin oluşturulduğu salt okunur bir şablon olduğunu zaten biliyoruz. Her görüntü bir dizi seviyeden oluşur. Docker'ın kullanım alanları sendika dosya sistemi bu seviyeleri tek bir görüntüde birleştirmek için. Union dosya sistemi, farklı dosya sistemlerinden (farklı dallar) dosya ve dizinlerin şeffaf bir şekilde üst üste binmesine olanak tanıyarak tutarlı bir dosya sistemi oluşturur.

Docker'ın hafif olmasının nedenlerinden biri de bunun gibi katmanları kullanmasıdır. Bir uygulamayı güncellemek gibi bir görüntüyü değiştirdiğinizde yeni bir katman oluşturulur. Yani, sanal makinede yapmanız gerekebileceği gibi görüntünün tamamını değiştirmeden veya yeniden oluşturmadan yalnızca katman eklenir veya güncellenir. Ve yeni görüntünün tamamını dağıtmanıza gerek yoktur; yalnızca güncelleme dağıtılır, böylece görüntülerin dağıtımı daha kolay ve daha hızlı olur.

Her görüntünün kalbinde temel bir görüntü bulunur. Örneğin, Ubuntu'nun temel görüntüsü olan ubuntu veya Fedora dağıtımının temel görüntüsü olan Fedora. Görselleri yeni görseller oluşturmak için temel olarak da kullanabilirsiniz. Örneğin bir apache görseliniz varsa bunu web uygulamalarınız için temel görsel olarak kullanabilirsiniz.

Not! Docker genellikle görüntüleri Docker Hub kayıt defterinden çeker.

Bu temel görüntülerden Docker görüntüleri oluşturulabilir; bu görüntüleri oluşturma adımlarına talimatlar diyoruz. Her talimat yeni bir görüntü veya seviye oluşturur. Talimatlar aşağıdaki gibi olacaktır:

  • komutu çalıştır
  • dosya veya dizin ekleme
  • ortam değişkeni oluşturma
  • Bu görüntünün kapsayıcısı başlatıldığında ne çalıştırılacağına ilişkin talimatlar

Bu talimatlar bir dosyada saklanır Dockerfile. Docker bunu okuyor Dockerfile, görüntüyü oluşturduğunuzda bu talimatları yürütür ve son görüntüyü döndürür.

Liman işçisi kayıt defteri nasıl çalışır?

Kayıt defteri, liman işçisi görüntüleri için bir depodur. İmaj oluşturulduktan sonra onu genel Docker Hub kayıt defterinde veya kişisel kayıt defterinizde yayınlayabilirsiniz.

Docker istemcisiyle önceden yayınlanmış görüntüleri arayabilir ve bunları docker makinenize indirerek kapsayıcılar oluşturabilirsiniz.

Docker Hub genel ve özel görüntü depoları sağlar. Herkese açık depolardaki görselleri aramak ve indirmek herkes tarafından kullanılabilir. Özel depoların içerikleri arama sonuçlarına dahil edilmez. Ve yalnızca siz ve kullanıcılarınız bu görselleri alabilir ve onlardan kapsayıcılar oluşturabilirsiniz.

Bir konteyner nasıl çalışır?

Bir kapsayıcı bir işletim sistemi, kullanıcı dosyaları ve meta verilerden oluşur. Bildiğimiz gibi her konteyner bir görüntüden yaratılıyor. Bu görüntü docker'a konteynerde ne olduğunu, hangi işlemin başlatılacağını, konteynerin ne zaman başlatılacağını ve diğer yapılandırma verilerini anlatır. Docker görüntüsü salt okunurdur. Docker bir konteyneri başlattığında, uygulamanın çalıştırılabileceği görüntünün üstünde (daha önce belirtildiği gibi birleşim dosya sistemini kullanarak) bir okuma/yazma katmanı oluşturur.

Konteyner başladığında ne olur?

Veya programı kullanarak dockerveya RESTful API'yi kullanarak, docker istemcisi docker arka plan programına konteyneri başlatmasını söyler.

$ sudo docker run -i -t ubuntu /bin/bash

Bu komuta bir göz atalım. İstemci şu komut kullanılarak başlatılır: docker, seçenekli run, yeni bir konteynerin piyasaya sürüleceğini söylüyor. Bir konteyneri çalıştırmak için minimum gereksinimler aşağıdaki özelliklerdir:

  • kapsayıcıyı oluşturmak için hangi görüntünün kullanılacağı. Bizim durumumuzda ubuntu
  • kapsayıcı başlatıldığında çalıştırmak istediğiniz komut. Bizim durumumuzda /bin/bash

Bu komutu çalıştırdığımızda başlık altında ne olur?

Docker sırasıyla şunları yapar:

  • ubuntu görüntüsünü indirir: Liman işçisi görüntünün kullanılabilirliğini kontrol eder ubuntu yerel makinede ve orada değilse, şu adresten indirin: Docker Hub'ı. Bir görüntü varsa onu bir kapsayıcı oluşturmak için kullanır;
  • bir kapsayıcı oluşturur: görüntü alındığında, docker bunu bir kap oluşturmak için kullanır;
  • dosya sistemini başlatır ve salt okunur düzeyi bağlar: kapsayıcı dosya sisteminde oluşturulur ve görüntü salt okunur düzeye eklenir;
  • ağı/köprüyü başlatır: docker'ın ana makineyle iletişim kurmasına olanak tanıyan bir ağ arayüzü oluşturur;
  • IP adresini ayarlama: adresi bulur ve ayarlar;
  • Belirtilen işlemi başlatır: uygulamanızı başlatır;
  • Uygulamanızı işler ve çıktı üretir: uygulamanızın nasıl performans gösterdiğini takip edebilmeniz için uygulamanızın standart giriş, çıkış ve hata akışını bağlar ve günlüğe kaydeder.

Artık çalışan bir konteyneriniz var. Container'ınızı yönetebilir, uygulamanızla etkileşime geçebilirsiniz. Uygulamayı durdurmaya karar verdiğinizde kapsayıcıyı silin.

Kullanılan teknolojiler

Docker, Go'da yazılmıştır ve yukarıdaki işlevleri uygulamak için Linux çekirdeğinin bazı özelliklerini kullanır.

Ad alanları

Docker teknolojiyi kullanıyor namespaces Container dediğimiz izole çalışma alanlarını düzenlemek. Bir konteyneri başlattığımızda, docker o konteyner için bir dizi ad alanı oluşturur.

Bu, kabın her yönünün kendi ad alanında çalıştığı ve harici sisteme erişimi olmadığı izole bir katman oluşturur.

Docker'ın kullandığı bazı ad alanlarının listesi:

  • ödeme: süreci izole etmek için;
  • ağ: ağ arayüzlerini yönetmek için;
  • ipc: IPC kaynaklarını yönetmek için. (ICP: Süreçler Arası İletişim);
  • not: bağlama noktalarını yönetmek için;
  • UTC: çekirdeği izole etmek ve sürüm oluşturmayı kontrol etmek için (UTC: Unix zaman paylaşım sistemi).

Kontrol grupları

Docker da teknolojiyi kullanıyor cgroups veya kontrol grupları. Bir uygulamayı yalıtılmış olarak çalıştırmanın anahtarı, uygulamaya yalnızca sağlamak istediğiniz kaynakları sağlamaktır. Bu, konteynerlerin iyi komşular olmasını sağlar. Kontrol grupları, mevcut donanım kaynaklarını paylaşmanıza ve gerekirse sınırlar ve kısıtlamalar belirlemenize olanak tanır. Örneğin, kapsayıcı için olası bellek miktarını sınırlayın.

Birlik Dosya Sistemi

Union File Sysem veya UnionFS, katmanlar oluşturarak çalışan, onu çok hafif ve hızlı hale getiren bir dosya sistemidir. Docker, konteynerin oluşturulduğu blokları oluşturmak için UnionFS'yi kullanır. Docker, UnionFS'nin çeşitli varyantlarını kullanabilir: AUFS, btrfs, vfs ve DeviceMapper.

Kapsayıcı Biçimleri

Docker bu bileşenleri konteyner formatı dediğimiz bir sarmalayıcıda birleştirir. Varsayılan format denir libcontainer. Docker ayrıca Linux'ta geleneksel konteyner formatını da destekler. LXC. Gelecekte Docker diğer kapsayıcı formatlarını destekleyebilir. Örneğin, BSD Hapishaneleri veya Solaris Bölgeleri ile entegrasyon.

Kaynak: habr.com

Yorum ekle