internet pencereler Android

Docker tabanlı örnek çözümü. Docker'ın temel özelliklerinin tanıtılması

Docker görüntüsü ve kapsayıcı yönetimi komutları için başvuru.

Şartlar

resim belirli bir işletim sistemine dayalı statik bir yapıdır.

konteyner görüntünün çalışan örneğidir.

Docker başlatma hakları

Docker kapsayıcılarını kendi kullanıcınız altında (sudo olmadan) çalıştırmak için uygun gruba eklemeniz gerekir:

Sudo usermod -aG liman işçisi YOU_USER

liman işçisi hizmeti

Docker Hizmet Yönetimi "a:

Sudo hizmeti liman işçisi başlat | durdur | yeniden başlat | durum sudo yeniden başlat liman işçisi # takma ad

Görüntüler

Mevcut görünümlerin listesi:

liman işçisi görüntüleri

Resmi (veya tüm depoyu) resmi kayıttan (görüntü deposu) indirin:

Docker ubuntu'yu çekiyor: 14.04

Görüntü bilgilerini görüntüleyin:

Docker ubuntu'yu inceliyor

Resmi Sil:

Docker CONTAINER_ID IMAGE_NAME taahhüt etti

Konteynerler

Dikkat!

Docker konteynerini başlattıktan sonra servisler/daemon'lar (SSH, Supervisor vb. gibi) otomatik olarak başlamaz! Hatayı ayıklamak için birkaç saat harcadım: " ssh_exchange_identification: okuma: Bağlantı eş tarafından sıfırlandı", konteynere SSH üzerinden bağlanmaya çalıştığınızda. Ancak sshd arka plan programının henüz başlamadığı ortaya çıktı. Konteyneri başlattıktan sonra gerekli arka plan programlarını veya süpervizörü manuel olarak başlatmanız gerekecek:

Docker exec CONTAINER_ID bash -c "hizmet ssh başlangıcı"

Tüm kapsayıcıların listesi (başlatıldı ve durduruldu):

liman işçisi ps -a

Konteyner(ler)i çıkarın:

Docker rm CONTAINER_ID CONTAINER_ID

Tüm kapları çıkarın:

Docker rm $ (docker ps -aq)

Ubuntu 14.04 ile etkileşimli modda bir Docker kapsayıcısı oluşturun ve çalıştırın (bu kapsayıcının kabuğunu açın):

Docker run -it ubuntu bash docker run [seçenekler] görüntü [komut] -i Etkileşimli mod, STDIN'i açık tut -t stdin ve stdout ekleyen bir sözde-TTY ayırın / oluşturur --name ID -w yerine kapsayıcı adı Çalışma dizinini belirtin ( --workdir) -e Kapsayıcıdaki ortam değişkenini ayarlayın -u Kullanıcı: kapsayıcının altında çalıştırılacağı grup -v Ana bilgisayar sisteminin dosyasını veya dizinini kapsayıcıya bağlayın -p Bağlantı noktalarını iletin konteyner -<порт хост-системы>:<порт контейнера>(--publish =) --entrypoint ENTRYPOINT Dockerfile'dan varsayılan komutu değiştir

Not

Kapsayıcıyı durdurmadan TTY'yi ayırmak için Ctr + P + Ctrl + Q tuşlarına basın.

SSH bağlantı noktası yönlendirme ile arka plan programı modunda bir Docker kapsayıcısı oluşturun ve çalıştırın:

Docker çalıştır -itd -p 127.0.0.1:221:22 ubuntu

Bir kapsayıcı oluşturup başlatın ve ardından durdurduktan sonra bu kapsayıcıyı silin (hata ayıklama için kullanışlıdır):

Docker çalıştırma -i -t --rm ubuntu bash

Durdurulmuş bir kapsayıcıyı etkileşimli olarak başlatın:

Docker start -i CONTAINER_ID

Daemonized bir kapsayıcıya bağlanın:

Docker CONTAINER_ID ekle

liman işçisi komutları

Kullanım: docker COMMAND docker arka plan programı [--help | ...] liman işçisi [--help | -v | --version] Kapsayıcılar için kendi kendine yeterli bir çalışma zamanı. Seçenekler: --config = ~ / .docker İstemci yapılandırma dosyalarının konumu -D, --debug = false Hata ayıklama modunu etkinleştir --disable-legacy-registry = false Eski kayıtlarla iletişim kurma -H, --host = Daemon soketi ( s) -h'ye bağlanmak için, --help = false Yazdırma kullanımı -l, --log-level = info Günlük seviyesini ayarlayın --tls = false TLS kullanın; --tlsverify tarafından ima edilir --tlscacert = ~ / .docker / ca.pem Yalnızca bu CA tarafından imzalanan güven sertifikaları --tlscert = ~ / .docker / cert.pem TLS sertifika dosyasının yolu --tlskey = ~ / .docker / key.pem TLS anahtar dosyasının yolu --tlsverify = false TLS kullanın ve uzaktan kumandayı doğrulayın -v, --version = false Sürüm bilgilerini yazdırın ve çıkın Komutlar: ekle Çalışan bir kapsayıcı derlemesine ekle Dockerfile taahhüdünden bir görüntü oluşturun Bir bir kapsayıcıdan yeni görüntü "cp'yi değiştirir Bir kap ve yerel dosya sistemi arasında dosyaları / klasörleri kopyalayın oluşturun Yeni bir kap farkı oluşturun Bir kapsayıcıdaki değişiklikleri inceleyin" dosya sistemi olayları Sunucudan gerçek zamanlı olayları alın exec Çalışan bir kapsayıcıda bir komut çalıştırın dışa aktar Bir kapsayıcının dosya sistemini katran arşivi geçmişi olarak dışa aktar Görüntünün geçmişini göster Görüntüleri listele içe aktar Bir dosya sistemi oluşturmak için içeriği bir tarball'dan içe aktarın görüntü bilgisi Sistem genelinde bilgileri görüntüleyin denetleyin Bir kap veya görüntüdeki düşük seviyeli bilgileri döndür öldür çalışan bir konteyneri öldür l oad Bir katran arşivinden veya STDIN oturum açma işleminden bir görüntü yükleyin Bir Docker kayıt defterine kaydolun veya oturum açın oturumu kapatın Bir Docker kayıt defteri günlüklerinden çıkış yapın Bir kapsayıcı ağının günlüklerini alın Docker ağlarını yönetin duraklat Bir kapsayıcı bağlantı noktası içindeki tüm işlemleri duraklatın Bağlantı noktası eşlemelerini veya bir CONTAINER için özel eşleme ps Konteynerler listesi çekme Kayıt defteri push'undan bir görüntü veya havuz çekin Bir görüntüyü veya havuzu bir kayıt defterine itin Yeniden adlandırın Bir kapsayıcıyı yeniden adlandırın Bir kapsayıcıyı yeniden başlatın rm Bir veya daha fazla kapsayıcıyı kaldırın rmi Bir veya daha fazla görüntüyü kaldırın Çalıştırın yeni bir kapsayıcıda bir komut kaydetme Bir görüntüyü (ler) bir tar arşiv aramasına kaydedin Görüntüler için Docker Hub'da arama başlatın Bir veya daha fazla durdurulmuş kapsayıcı istatistiklerini başlatın Kapsayıcıların canlı bir akışını görüntüleyin (ler) kaynak kullanım istatistiklerini durdur Çalışan bir kapsayıcı etiketini durdurun Bir görüntüyü bir havuzun üstüne etiketleyin Bir kapsayıcının duraklatmasını geri almanın çalışan işlemlerini görüntüleyin Bir kapsayıcı birimindeki tüm işlemlerin duraklatmasını kaldırın Docker birimlerini yönetin Bekleyenleri engelle Bir konteyner durduğunda, çıkış kodunu yazdırın Bir komut hakkında daha fazla bilgi için "docker COMMAND --help" komutunu çalıştırın.

Birkaç aydır web projelerinin geliştirilmesini/teslimatını yapılandırmak için docker kullanıyorum. "Habrahabr" okuyucularına liman işçisi hakkında giriş makalesinin bir çevirisini sunuyorum - "Liman işçisini anlamak".

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ı çalışır hale getirmek için tasarlanmıştır. Docker ile uygulamanızı altyapınızdan ayırabilir ve altyapıyı yönetilen bir uygulama olarak değerlendirebilirsiniz. Docker, kodunuzu daha hızlı dağıtmanıza, daha hızlı test etmenize, uygulamaları daha hızlı dağıtmanıza ve kod yazma ile kod çalıştırma arasındaki süreyi kısaltmanıza yardımcı olur. Docker bunu, uygulamalarınızı yönetmeye ve dağıtmaya yardımcı olmak için süreçleri ve yardımcı programları kullanarak hafif bir kapsayıcı sanallaştırma çerçevesiyle yapar.

Docker, özünde, bir kapsayıcıda güvenli bir şekilde izole edilmiş hemen hemen her uygulamayı çalıştırmanıza olanak tanır. Güvenli izolasyon, aynı ana bilgisayarda aynı anda birçok kapsayıcı çalıştırmanıza olanak tanır. Ek hipervizör 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 ayrıca kullanılmış bileşenleri) liman işçisi kaplarına paketleme;
  • geliştirme ve test için bu kapların ekiplerinize dağıtılması ve teslimi;
  • bu kapsayıcıları hem veri merkezlerinde hem de bulutlarda üretimlerinize yüklemek.

Docker'ı ne için kullanabilirim?

Uygulamalarınızı hızlı bir şekilde yükleme

Docker, geliştirme döngünüzü düzenlemek için harikadır. Docker, geliştiricilerin uygulamalar ve hizmetler ile yerel kapsayıcıları kullanmalarına olanak tanır. Bu, daha sonra sürekli entegrasyon ve dağıtım iş akışıyla entegre olmanızı sağlar.

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

Daha kolay yerleştirme ve açma

Konteyner tabanlı bir liman işçisi platformu, yükünüzü taşımayı kolaylaştıracaktır. Docker kapsayıcıları, yerel makinenizde hem gerçek hem de sanal makinede veri merkezinde ve 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 dağıtmak için docker'ı kullanabilirsiniz. Docker'ın hızı, bunu neredeyse gerçek zamanlı olarak yapmanızı sağlar.

Daha yüksek yükler ve daha fazla yük

Docker hafif ve hızlıdır. Hiper yönetici tabanlı sanal makinelere sağlam, uygun maliyetli bir alternatif sunar. Kendi bulutunuzu veya hizmet olarak platformunuzu oluşturma gibi yüksek yüklü ortamlarda özellikle yararlıdır. Ancak, mevcut kaynaklardan daha fazlasını elde etmek istediğinizde, küçük ve orta ölçekli uygulamalar için de yararlıdır.

Docker'ın ana bileşenleri

Docker'ın iki ana bileşeni vardır:
  • Docker: açık kaynaklı bir sanallaştırma platformu;
  • Docker Hub: Docker kapsayıcılarını dağıtmak ve yönetmek için hizmet olarak platformumuz.
Not! Docker, Apache 2.0 lisansı altında dağıtılmaktadır.

liman işçisi mimarisi

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

liman işçisi arka plan programı

Şemada gösterildiği gibi, arka plan programı ana makinede başlatılır. Kullanıcı sunucuyla doğrudan etkileşime girmez, bunun için istemciyi kullanır.

liman işçisi istemcisi

Docker istemcisi, docker programı Docker'ın ana arabirimidir. Kullanıcıdan komutları alır ve liman işçisi arka plan programı ile etkileşime girer.

liman işçisi içinde

Liman işçisinin neyden yapıldığını anlamak için üç bileşen hakkında bilgi sahibi olmanız gerekir:
  • Görüntüler
  • kayıt (kayıtlar)
  • konteynerler

Görüntüler

Docker görüntüsü salt okunur bir şablondur. Örneğin, bir görüntü, Apache'li bir Ubuntu işletim sistemi ve üzerinde bir uygulama içerebilir. Görüntüler, kapsayıcı oluşturmak için kullanılır. Docker, yeni görüntüler oluşturmayı, mevcut olanları güncellemeyi veya başkaları tarafından oluşturulan görüntüleri indirmeyi kolaylaştırır. Görüntüler, bir liman işçisi yapısının bir bileşenidir.

Kayıt

Docker kayıt defteri görüntüleri depolar. Görüntüleri indirebileceğiniz veya yükleyebileceğiniz genel ve özel kayıtlar vardır. Genel Docker kayıt defteri, Docker Hub'dır. Çok büyük bir resim koleksiyonu var. Bildiğiniz gibi, resimler sizin tarafınızdan oluşturulabilir veya başkaları tarafından oluşturulan resimleri kullanabilirsiniz. Kayıtlar dağıtım bileşenleridir.

Konteynerler

Konteynerler dizinler gibidir. Kapsayıcılar, 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 kapsayıcı izole edilmiştir ve uygulama için güvenli bir platformdur. Konteynerler işin bir bileşenidir.

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

Şimdiye kadar şunu biliyoruz:
  • uygulamalarımızın bulunduğu görüntüleri oluşturabiliriz;
  • uygulamaları çalıştırmak için görüntülerden kaplar oluşturabiliriz;
  • görüntüleri Docker Hub veya başka bir görüntü kayıt defteri aracılığıyla dağıtabiliriz.
Bu bileşenlerin nasıl bir araya geldiğini görelim.

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

Bir görüntünün, bir kapsayıcının oluşturulduğu salt okunur bir şablon olduğunu zaten biliyoruz. Her görüntü bir dizi seviyeden oluşur. Docker, bu katmanları tek bir görüntüde birleştirmek için birleşim dosya sistemini kullanır. Birleşim dosya sistemi, farklı dosya sistemlerinden (farklı dallar) dosya ve dizinlerin şeffaf bir şekilde örtüşmesine ve tutarlı bir dosya sistemi oluşturmasına izin verir.

Docker'ın hafif olmasının nedenlerinden biri, bunun gibi katmanların kullanılmasıdır. Görüntüyü değiştirdiğinizde, örneğin uygulamayı güncellediğinizde, yeni bir katman oluşturulur. Böylece, tüm görüntüyü değiştirmeden veya yeniden oluşturmadan, sanal bir makine ile yapmanız gerekebileceği gibi, yalnızca seviye eklenir veya güncellenir. Ve tamamen yeni görüntüyü dağıtmanız gerekmez, yalnızca güncelleme dağıtılır, bu da görüntülerin dağıtımını daha kolay ve hızlı hale getirir.

Her görünümün kalbinde temel bir görünüm vardır. Örneğin, bir Ubuntu temel görüntüsü olan ubuntu veya bir Fedora temel görüntüsü olan fedora. Görüntüleri yeni görüntüler oluşturmak için temel olarak da kullanabilirsiniz. Örneğin, bir apache resminiz varsa, bunu web uygulamalarınız için temel resim olarak kullanabilirsiniz.

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

Bu temel imajlardan docker imajları oluşturulabilir, bu imajları oluşturmak için açıklama adımlarına komutlar diyoruz. Her talimat yeni bir görüntü veya seviye oluşturur. Talimatlar aşağıdaki gibi olacaktır:

  • çalışan komut
  • dosya veya dizin ekleme
  • ortam değişkeni oluşturma
  • Bu görüntünün kapsayıcı başlatıldığında neyin çalıştırılacağını belirtmek

Bu talimatlar Dockerfile'de saklanır. Docker, görüntüyü oluşturduğunuzda bu Docker dosyasını okur, bu talimatları izler ve son görüntüyü döndürür.

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

Kayıt defteri, docker görüntüleri için bir havuzdur. Görüntüyü oluşturduktan sonra, genel Docker Hub kayıt defterinde veya kişisel kayıt defterinizde yayınlayabilirsiniz.

Docker istemcisi ile önceden yayınlanmış görüntüleri arayabilir ve konteynerler oluşturmak için bunları docker'dan makinenize indirebilirsiniz.

Docker Hub, genel ve özel görüntü havuzları sağlar. Herkese açık depolardan resim aramak ve indirmek herkes tarafından kullanılabilir. Özel depoların içeriği arama sonuçlarında yer almaz. Ve yalnızca siz ve kullanıcılarınız bu görüntüleri alabilir ve onlardan kapsayıcı oluşturabilirsiniz.

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

Kapsayıcı, işletim sistemi, kullanıcı dosyaları ve meta verilerden oluşur. Bildiğimiz gibi, her kapsayıcı bir görüntüden oluşturulur. Bu görüntü, docker'a kapsayıcıda ne olduğunu, hangi işlemin çalıştırılacağını, kapsayıcının ne zaman başladığını ve diğer yapılandırma verilerini söyler. Docker görüntüsü salt okunurdur. Docker kapsayıcıyı başlattığında, görüntünün üzerinde (daha önce belirtildiği gibi birleşim dosya sistemini kullanarak) uygulamanın çalışabileceği bir okuma/yazma katmanı oluşturur.

Bir kapsayıcı başladığında ne olur?

Liman işçisi programını veya RESTful API'sini kullanarak, liman işçisi istemcisi, liman işçisine kapsayıcıyı başlatmasını söyler.

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

Bu komutla ilgilenelim. İstemci, yeni bir kapsayıcının başlatılacağını söyleyen bir çalıştırma seçeneğiyle docker komutunu kullanarak başlatılır. Bir kapsayıcı başlatmak için minimum gereksinimler aşağıdaki niteliklerdir:

  • 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 kaputun altında ne olur?

Docker sırayla şunları yapar:

  • ubuntu görüntüsünü indirir: docker, yerel makinede bir ubuntu görüntüsünün olup olmadığını kontrol eder ve değilse, Docker Hub'dan indirir. 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 kapsayıcıyı 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 salt okunur düzeyi görüntüye eklenir;
  • ağı / köprüyü başlatır: docker'ın ana makineyle iletişim kurmasını sağlayan bir ağ arabirimi oluşturur;
  • IP adresini ayarlama: adresi bulur ve ayarlar;
  • Belirtilen işlemi başlatır: uygulamanızı başlatır;
  • Uygulamanızın çıktısını işler ve çıktılar: uygulamanızın nasıl çalıştığını 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 kapsayıcınız var. Kapsayıcınızı yönetebilir, uygulamanızla etkileşime geçebilirsiniz. Uygulamayı durdurmaya karar verdiğinizde kabı çıkarın.

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, kapsayıcı olarak adlandırdığımız yalıtılmış çalışma alanlarını düzenlemek için ad alanları teknolojisini kullanır. Bir kapsayıcıyı başlattığımızda, docker o kapsayıcı için bir dizi ad alanı oluşturur.

Bu, yalıtılmış bir katman oluşturur, kapsayıcının her yönü kendi ad alanında çalışır ve harici sisteme erişimi yoktur.

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

  • pid: süreci izole etmek için;
  • ağ: ağ arayüzlerini yönetmek;
  • ipc: IPC kaynaklarını yönetmek için. (ICP: İşlemler Arası İletişim);
  • mnt: bağlama noktalarını yönetmek için;
  • UTC:çekirdek izolasyonu ve sürüm oluşturma kontrolü için (UTC: Unix zaman paylaşım sistemi).

Kontrol grupları

Docker ayrıca cgroups teknolojisini veya kontrol gruplarını kullanır. 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ğlayacaktır. Kontrol grupları, mevcut donanım kaynaklarını paylaşmanıza ve gerekirse limitler ve limitler belirlemenize izin verir. Örneğin, bir kapsayıcının kullanabileceği 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, kapsayıcının oluşturulduğu blokları oluşturmak için UnionFS'yi kullanır. Docker, AUFS, btrfs, vfs ve DeviceMapper dahil olmak üzere birçok UnionFS çeşidini kullanabilir.

Kapsayıcı biçimleri

Docker, bu bileşenleri, kapsayıcı biçimi dediğimiz bir sarmalayıcıda birleştirir. Varsayılan biçim libcontainer'dır. Docker ayrıca LXC kullanan geleneksel Linux kapsayıcı biçimini de destekler. Docker gelecekte diğer kapsayıcı biçimlerini destekleyebilir. Örneğin, BSD Hapishaneleri veya Solaris Bölgeleri ile entegrasyon.

Konuya bir kereden fazla değindik ve yapımı için birçok sistem düşündük. Bugün Docker kapsayıcıları ile başka bir harika sistemi tanıtacağız.

Serinin sonraki makalelerinde kullanışlı olacak temel işlevleri açıklayarak başlayalım ve Docker mimarisini kısaca hatırlayalım. Docker bir istemci-sunucu mimarisi kullanır ve kullanarak sunucuya erişen bir istemci - docker yardımcı programından oluşur. RESTful API, ve Linux işletim sisteminde bir arka plan programı (bkz. Şekil 1). Docker, Linux dışı işletim sistemlerinde çalışsa da, bu makalede ele alınmamıştır.

Docker'ın ana bileşenleri:
    • Konteynerler- uygulamaların yürütüldüğü işletim sistemi teknolojileri kullanılarak izole edilmiş kullanıcı ortamları. En basit yol, bir Docker kapsayıcısını bir görüntüden başlatılan bir uygulama olarak tanımlamaktır. Bu arada, bu tam olarak Docker'ın ideolojik olarak örneğin LXC'den farklı olduğu şeydir ( Linux kapsayıcıları), aynı Linux çekirdek teknolojilerini kullanmalarına rağmen. Docker projesinin geliştiricileri, bir kapsayıcının tek bir uygulama olduğu ilkesine bağlıdır.
    • Görüntüler- salt okunur uygulama şablonları. Birlikte dosya sistemini temsil eden, önceki düzeyi değiştirerek veya tamamlayarak mevcut görüntülerin üzerine yeni düzeyler eklenebilir. Tipik olarak, ya halihazırda çalışan bir kapsayıcıyı mevcut bir kapsayıcının üzerine yeni bir görüntüye kaydederek ya da yardımcı program için özel yönergeler kullanılarak yeni bir görüntü oluşturulur. Dosya sistemi düzeyinde bir kapsayıcının farklı düzeylerini ayırmak için, AUFS, btrfs, vfs ve Cihaz Eşleştiricisi... Docker ile birlikte kullanmayı düşünüyorsanız SELinux, o zaman gerekli Cihaz Eşleştiricisi.
    • Kayıtlar içeren depolar ( depo) görüntüler, - ağ görüntü depoları. Hem özel hem de genel olabilirler. En ünlü kayıt defteridir.

GNU / Linux işletim sistemleri, kapsayıcıları izole etmek için standart Linux çekirdek teknolojilerini kullanır, örneğin:
  • Ad alanları ( Linux Ad Alanları).
  • Kontrol grupları ( Gruplar).
  • Ayrıcalık Yönetim Araçları ( Linux Yetenekleri).
  • Ek, zorunlu güvenlik sistemleri, örneğin AppArmor veya SELinux.

Listelenen teknolojileri biraz daha ayrıntılı olarak ele alalım.

Kontrol grubu mekanizması (Gruplar) sistem kaynaklarının tahsisi, önceliklendirilmesi ve yönetimine ince ayar yapmak için bir araç sağlar. Kontrol grupları Linux çekirdeğinde uygulanmaktadır. Modern dağıtımlarda kontrol grubu yönetimi, sistem, ancak, kütüphaneyi kullanarak kontrol etmek mümkün olmaya devam ediyor libcgroup ve yardımcı programlar cgconfig... Ana grup hiyerarşileri (kontrolörler olarak da adlandırılır) aşağıda listelenmiştir:

  • blkio- giriş-çıkış işlemlerine ve blok cihazlara erişime sınırlar koyar;
  • İşlemci- işlem zamanlayıcıyı kullanarak, işlemci zamanını görevler arasında dağıtır;
  • işlemci- CPU kaynaklarının kullanımı hakkında otomatik raporlar oluşturur. Kontrolör ile birlikte çalışır İşlemci Yukarıda tarif edilen;
  • işlemci- belirli işlemcileri ve bellek düğümlerini görevlere atar;
  • cihazlar- görevlerin belirli cihazlara erişimini düzenler;
  • dondurucu- görevleri askıya alır veya sürdürür;
  • hafıza- kontrol grubunun görevlerine göre bellek kullanımına ilişkin sınırları belirler ve raporlar oluşturur;
  • net_cls- bir sınıf tanımlayıcısı ile ağ paketlerinin etiketlenmesini gerçekleştirir ( sınıf kimliği). Bu, trafik kontrolörünün ( tc komutu) ve güvenlik duvarı ( iptables) trafiği işlerken bu etiketleri dikkate alın;
  • perf_event- yardımcı programı kullanarak kontrol gruplarını izlemenizi sağlar mükemmel;
  • devtlb- büyük sanal bellek sayfaları kullanmanıza ve bunlara sınırlamalar uygulamanıza olanak tanır.

ad alanları, sırayla, kaynak tahsisini değil, çekirdek veri yapılarına erişimi kontrol ederler. Aslında bu, süreçlerin birbirinden yalıtılması ve paralel olarak "özdeş", ancak birbiriyle örtüşmeyen süreçler, kullanıcılar ve ağ arayüzleri hiyerarşilerine sahip olma yeteneği anlamına gelir. İstenirse, farklı servislerin kendi servisleri bile olabilir. geri döngü arayüzleri.

Docker tarafından kullanılan ad alanlarına örnekler:
  • PID, İşlem Kimliği- süreçlerin hiyerarşisinin izolasyonu.
  • NET, Ağ- ağ arayüzlerinin izolasyonu.
  • PC, Prosesler Arası İletişim- süreçler arasındaki etkileşimin yönetimi.
  • MNT, Dağı- bağlama noktaları yönetimi.
  • UTS, Unix Devre Paylaşım Sistemi- çekirdek ve sürüm tanımlayıcılarının izolasyonu.

denilen bir mekanizma yetenekler kök kullanıcının ayrıcalıklarını küçük ayrıcalık gruplarına ayırmanıza ve bunları ayrı ayrı atamanıza olanak tanır. Bu işlevsellik, sürümden beri GNU / Linux'ta ortaya çıkmıştır. çekirdekler 2.2. Başlangıçta, kapsayıcılar sınırlı bir ayrıcalık kümesiyle başlatılır.

Docker komut seçeneklerini etkinleştirebilir ve devre dışı bırakabilirsiniz:
  • montaj işlemleri;
  • soketlere erişim;
  • Dosyaların özniteliklerini veya sahibini değiştirmek gibi dosya sistemi üzerinde bazı işlemleri gerçekleştirme.

Man sayfasını kullanarak ayrıcalıklar hakkında daha fazla bilgi edinebilirsiniz. YETENEKLER (7).

Docker'ı Yükleme

Örnek olarak CentOS kullanarak Docker kurulumuna bir göz atalım. CentOS ile çalışırken bir seçeneğiniz var: u'nun en son sürümünü kullanın pstream veya CentOS projesi tarafından Red Hat eklentileriyle oluşturulmuş bir sürüm. Değişikliklerin açıklaması sayfada mevcuttur.

Temel olarak, bu, Red Hat geliştiricileri tarafından önerilen, ancak henüz ana koda kabul edilmeyen yeni yukarı akış sürümlerinden ve değişikliklerden yapılan düzeltmelerin tersine taşınmasıdır. Bu yazının yazıldığı sırada en göze çarpan fark, daha yeni sürümlerde docker hizmetinin üç bölüme ayrılmış olmasıydı: bir arka plan programı liman işçisi, konteyner ve runc... Red Hat henüz bu değişikliğin kararlı olduğunu düşünmüyor ve tek parça 1.10 yürütülebilir bir sürüm gönderiyor.

Kurulum için depo ayarları yukarı akış sürümleri, diğer dağıtımlara ve işletim sistemlerine kurulum talimatlarının yanı sıra resmi web sitesindeki kurulum kılavuzunda verilmiştir. Spesifik olarak, CentOS 7 deposunun ayarları:

# cat /etc/yum.repos.d/docker.repo name = Docker Repository baseurl = https: //yum.dockerproject.org/repo/main/centos/7 etkin = 1 gpgcheck = 1 gpgkey = https: // yum .dockerproject.org / gpg

# cat /etc/yum.repos.d/docker.repo

isim = Depo

baseurl = https: // yum .dockerproject .org / repo / ana / centos / 7

etkin = 1

gpgcheck = 1 gpgkey = https: // yum .dockerproject .org / gpg

Gerekli paketleri kurun ve hizmeti başlatın ve etkinleştirin:

# yum install -y docker-engine # systemctl docker.service'i başlat # systemctl docker.service'i etkinleştir

# yum install -y liman işçisi motoru

# systemctl docker.service'i başlat

# systemctl docker.service'i etkinleştir

Hizmet durumunu kontrol etme:

# systemctl durumu docker.service

# systemctl durumu docker.service

Docker ve ortamla ilgili sistem bilgilerini de görüntüleyebilirsiniz:

# liman işçisi bilgisi

Benzer bir komut çalıştırırsanız ve Docker'ı CentOS depolarından yüklerseniz, yazılımın daha eski bir sürümünü kullanmanız nedeniyle küçük farklılıklar göreceksiniz. çıktıdan liman işçisi bilgisi veri depolamak için sürücü olarak ne kullanıldığını öğrenebiliriz Cihaz eşleyici ve depolama olarak - bir dosya / var / lib / liman işçisi /:

# ls -lh / var / lib / docker / devicemapper / devicemapper / data -rw -------. 1 kök kök 100G 27 Aralık 12:00 / var / lib / docker / devicemapper / devicemapper / data

# ls -lh / var / lib / docker / devicemapper / devicemapper / veri

Rw - - - -. 1 kök kök 100G 27 Aralık 12:00 / var / lib / / devicemapper / devicemapper / data

Daemon başlatma seçenekleri, genellikle CentOS'ta olduğu gibi, / etc / sysconfig /... Bu durumda, docker dosyasının adı. karşılık gelen satır / etc / sysconfig / liman işçisi açıklama seçenekleri:

SEÇENEKLER = "- selinux etkin --log-driver = dergi"

Docker komutunu root olmayan bir kullanıcı veya docker grubunun bir üyesi olarak çalıştırırsanız, aşağıdaki gibi bir hata görürsünüz:

$ liman işçisi arama mysql

$ mysql'de ara

Uyarı: arka plan programından varsayılan kayıt defteri uç noktası alınamadı (Docker arka plan programı ile bağlantı kurulamıyor. Docker arka plan programı bu ana bilgisayarda çalışıyor mu?). Sistem varsayılanını kullanma: https: // index. docker.io/v1/

Docker arka plan programına bağlanılamıyor. Docker arka plan programı bu ana bilgisayarda çalışıyor mu?

Docker grubuna gerçekten bir kullanıcı eklemenin, o kullanıcıyı kök gruba eklemekle eşdeğer olduğunu unutmayın.

RHEL / CentOS geliştiricileri, Docker arka plan programı güvenliğine yukarı akış Docker geliştiricilerinin kendilerinden biraz farklı bir yaklaşıma sahiptir. Red Hat'in yaklaşımı hakkında daha fazla bilgi için, RHEL geliştiricisi Dan Walsh tarafından yazılan bir makaleye bakın.

Docker'ın "standart" davranışını CentOS depolarından yüklemek istiyorsanız (yani resmi belgelerde açıklanmıştır), o zaman bir docker grubu oluşturmanız ve arka plan programı başlatma seçeneklerine eklemeniz gerekir:

SEÇENEKLER = "- selinux etkin --log-driver = günlük ↵ --grup = liman işçisi"

SEÇENEKLER = "--selinux etkin --log-driver = günlük ↵ --group = liman işçisi"

Ardından hizmeti yeniden başlatıyoruz ve docker soket dosyasının root'a değil docker grubuna ait olduğunu kontrol ediyoruz:

# ls -l /var/run/docker.sock

Görüntüleri ve Docker etiketlerini bulma

Docker Hub üzerinde bir kapsayıcı bulmaya çalışalım.

$ liman işçisi arama haproxy

$ arama haproksisi


Bu çıktıda, bir dizi HA Proxy görüntüsünün bir listesini elde ettik. Listedeki en üstteki öğe, resmi depodaki HA Proxy'sidir. Bu tür görüntüler, adında bir sembol olmaması bakımından farklılık gösterir. «/» kullanıcının havuzunun adını, konteynerin adından ayırmak. Yetkilinin arkasındaki örnek, açık kullanıcı havuzlarından iki haproxy görüntüsünü gösterir. eeacms ve milyon12.

Aşağıdaki iki gibi görüntüleri Docker Hub'a kaydolarak kendiniz oluşturabilirsiniz. Resmi olanlar, Docker, Inc. tarafından desteklenen özel bir ekip tarafından desteklenmektedir. Resmi deponun özellikleri:

  • Bunlar, en iyi uygulamalara ve en iyi uygulamalara dayalı olarak kullanılması önerilen resimlerdir.
  • Bunlar, daha fazla kişiselleştirme için bir başlangıç ​​noktası olabilecek temel görüntülerdir. Örneğin, Ubuntu, CentOS veya kitaplıkların ve geliştirme ortamlarının temel görüntüleri.
  • Sabit güvenlik açıklarına sahip en son yazılım sürümlerini içerir.
  • Bu, ürünlerin resmi dağıtım kanalıdır. Yalnızca resmi görselleri aramak için seçeneği kullanabilirsiniz. –Filtre “resmi = doğru” komutlar liman işçisi arama.

Komut çıktısındaki yıldızlar liman işçisi arama görüntünün popülerliğine karşılık gelir. Bu düğmenin analogu Beğenmek sosyal ağlarda veya diğer kullanıcılar için yer imlerinde. otomatik görüntünün, Docker Hub kullanılarak özel bir komut dosyasından otomatik olarak oluşturulduğu anlamına gelir. Genellikle, içeriğinin ilgili dosyaya aşinalık yoluyla kontrol edilebilmesi nedeniyle, otomatik olarak toplanan görüntüleri tercih etmelisiniz.

Resmi HA Proxy görüntüsünü indirin:

$ docker çekme haproxy Varsayılan etiketi kullanma: en son

Resmin tam adı şöyle görünebilir:

[kullanıcı adı] resim adı [: etiket]

Komutu ile indirilen resimlerin listesini görüntüleyebilirsiniz. liman işçisi resimleri:

Konteynerlerin başlatılması

Konteyneri çalıştırmak için görüntüyü indirmek gerekli değildir. Varsa, otomatik olarak yüklenecektir. Ubuntu ile bir konteyner başlatmayı deneyelim. Depoyu listelemeyeceğiz ve Canonical tarafından desteklenen en son resmi resmi indireceğiz.

$ liman işçisi çalıştır - bu ubuntu [e-posta korumalı]:/#

$ çalıştır - ubuntu

kök @ d7402d1f7c54: / #

takımın yanı sıra Çalıştırmak, iki seçenek belirledik: -ben- konteyner etkileşimli olarak çalışmalı ve -T- bir sözde terminal vurgulanmalıdır. Çıktıdan da görebileceğiniz gibi, kapsayıcıda kök kullanıcı ayrıcalıklarına sahibiz ve ana bilgisayar adı olarak kapsayıcı kimliği görüntüleniyor. İkincisi, tüm kapsayıcılar için doğru olmayabilir ve kapsayıcı geliştiricisine bağlıdır. Bunun gerçekten Ubuntu ortamı olduğunu kontrol edelim:

[e-posta korumalı]: / # kedi / etc / * yayın | grep DISTRIB_DESCRIPTION DISTRIB_DESCRIPTION = "Ubuntu 16.04.1 LTS"

kök @ d7402d1f7c54: / # kedi / etc / * yayın | grep DISTRIB_DESCRIPTION

DISTRIB_DESCRIPTION = "Ubuntu 16.04.1 LTS"

Adını kaldır komutu -a kap, ana bilgisayar çekirdeği ile çalıştığından, bu tür amaçlar için çalışmayacaktır.

Seçeneklerden biri, aşağıdakilere ek olarak kolaylık sağlamak için başvurulabilecek benzersiz bir kapsayıcı adı olabilir. Kapsayıcı kimliği. olarak verilir -İsim<имя>. Seçenek atlanırsa, ad otomatik olarak oluşturulur.

Otomatik olarak oluşturulan kap adları anlamsal bir yük taşımamaktadır, ancak ilginç bir gerçek olarak, isimlerin ünlü bir bilim adamı, mucit veya hacker'ın sıfatından ve adından rastgele oluşturulduğu belirtilebilir. Jeneratör kodunda, her isim için verilen şeklin ne için bilindiğine dair kısa bir açıklama bulabilirsiniz.

Komutu ile çalışan konteynerlerin listesini görüntüleyebilirsiniz. Bunu yapmak için ikinci bir terminal açın:

Ancak komutu verirsek, mysql görüntüsünden oluşturulan kapsayıcıyı bulamayacağız. seçeneği kullanalım -a bu, yalnızca çalışan kapsayıcıları değil, tüm kapsayıcıları gösterir:

Açıkçası, konteyner başlatılırken gerekli parametreler belirtilmedi. Bir kapsayıcıyı çalıştırmak için gereken ortam değişkenlerinin açıklaması için Docker Hub'daki resmi MySQL görüntüsüne bakın. Seçeneği kullanarak tekrar deneyelim -e kapsayıcıdaki ortam değişkenlerini ayarlar:

$ docker run --name mysql-test ↵ -e MYSQL_ROOT_PASSWORD = docker -d mysql

Son parametre, konteyner içinde yürütmek istediğimiz komuttur. Bu durumda, komut yorumlayıcıdır. bash... Seçenekler -o komutta daha önce kullanılanlara amaca benzer liman işçisi koşusu.

Aslında bu komutu kapsayıcıya çalıştırdıktan sonra mysql testi bir işlem daha eklendi - bash... Bu, pstree komutu kullanılarak açıkça görülebilir. Komut için kısaltılmış çıktı liman işçisi yürütme:

Docker'ın içinde, yalnızca Linux, ve deneysel olarak FreeBSD. Yerel olarak Linux'ta ve deneysel olarak FreeBSD'de çalışır. MacOSX altında, Windows - sanal bir makine aracılığıyla.

Docker çift yalıtımlıdır. Docker kapsayıcısının içinde bulunanları işletim sisteminden ve işletim sistemini Docker'ın içindekilerden izole etmek. İzolasyon, tüm dosyaların, bağlantı noktalarının, önceliklerin yalıtılması anlamına gelir.

Neredeyse sanal bir makine. Neredeyse, ama tam olarak değil.

"Bağımlılık cehennemi" diye bir şey var. Bilgisayarda yüklü olan herhangi bir yazılım bağımlılık yapar(konfigürasyon dosyaları, genellikle varlık adı verilen statik dosyalar, yardımcı yardımcı programlar / hizmetler, kitaplıklar vb.). Bu kütüphanelerin / yardımcı programların / hizmetlerin bir kısmı birbiriyle uyumsuz. Ve bu kütüphanelerin / yardımcı programların / hizmetlerin her birinin kendi bağımlılıkları olduğu göz önüne alındığında, durum daha da kötüdür.

Örneğin, normalde yalnızca Ubuntu 14.04'te (ve görünüşe göre Debian 7'de) derlenen Yandex.Cocaine kullanıyoruz. Ancak CentOS 6, 7, Debian 8, FreeBSD 9, 10, Ubuntu 15, 16 vb. altında değil. - onu derlemek imkansız... Docker'da bu işletim sistemleri üzerinde çalışıyoruz.

Öte yandan ve aynı zamanda daha modern başka bir yazılım yüklemeniz gerekiyor. Ve aynı zamanda daha yaşlı. Ve Linux'un ciddi anlamda farklı sürümlerinden bahsetmiyoruz bile. Örneğin, bazı yazılımlar en az Ubuntu 14.10 gerektirirken, diğerleri en az Linux 14.04 gerektirir.

liman işçisi işletim sisteminin ayrı bir sürümü ile ayrı bir ortam içinde bir program. Tüm yol için bir kök kullanırsanız, puf kapları pahasına, o zaman Docker kabının boyutu, ikili dosyanın boyutundan yalnızca birkaç kilobayt daha büyüktür, Docker altında çalıştırın.

Böylece, işletim sistemimizde olduğu gibi çalışan bir ikili dosyamız var.

Diyebilirsin - bah, evet bu uzun zamandır bilinen sanal makine. Ama hayır, öyle değil. Bunlar sözde kaplardır. Sanal makine gibi kokmuyor. Windows ve MacOSX dışında, sanal makine olmadan çalışmanın yalnızca deneysel olarak mümkün olduğu ve bu işletim sistemlerindeki norm, Docker'ı tam teşekküllü bir sanal makine içinde kullanmaktır.

Ancak Docker VM'leri yalnızca geliştirme için kullanılır. Docker sanal makineleri, üretimde çalışmak için kullanılmaz.

Docker, işletim sistemi kapsayıcılarını kullanır. Linux'ta LXC, FreeBSD'de Hapishaneler. Kapsayıcı, işletim sisteminin ana gövdesinden izole edilmiş bir işletim sistemi alanıdır. Kapsayıcının kendi dizin ağacı (sistem / dev, / bin, / sbin vb. dahil), kendi ağ bağlantı noktaları vb. vardır.

Ancak tam sanallaştırma kullanmaz. Hangi önemli ölçüde kaynak tasarrufu sağlar. 100 tam sanal makine çalıştırın güçlü bir sunucuda bile pek çalışmaz. Ve burada 100 Docker konteynerini zayıf bir ev makinesinde bile çalıştırmak mümkündür.

Doğru, eksik sanallaştırma kullanımı, kapsayıcıların içindeki işletim sistemlerinin kullanımını sınırlar. Kural olarak, Linux veya FreeBSD'nin özel olarak hazırlanmış sürümleri... Özel olarak eğitilmiştir. Windows - prensipte bir kapsayıcıda çalıştırmak imkansızdır.

Konteynerler Docker'dan önce vardı. Docker, kesinlikle konuşmak gerekirse, sadece çok uygun araç seti kapsayıcı sanallaştırmayı yönetmek için bir araya getirin. Fakat çok konforlu.

Neden kullanılır?

Her türlü Dropbox, Facebook ve diğer devlerden hizmetlerinde 1 milyon farklı program başlatan adamlar bununla karşılaştı. her yerde aynı işletim sistemi ayarlarını garanti etmek imkansızdır. Ve bu kritik.

o ölçüde gerçek bir sunucuda mükemmel şekilde yazılmış ve test edilmiş bir program tahmin edilemez şekilde davranmaya başlar.

Bu nedenle, bu akıllı adamlardan biri yeni bir konsept doğurdu - sunuculardaki her program, ayrı işletim sistemi ayarlarıyla kendi ortamında çalışır.

Ayrıca - başlangıçta bir yazılım geliştiricisi Docker kapsayıcısında bir programı test eder, belirli ayarlarla. VE aynı (veya aynı ayarlarla) Docker kapsayıcısında, program sunucuya gider.

o geliştirme ortamının ve çalışma zamanı ortamının çok daha büyük bir kimliğini garanti etmenize olanak tanır.

Ondan önce insanlar acı çekti, kurnaz montajcılar buldu ...

Daha sonra işletim sistemindeki ortamı düzene sokma girişimlerine tükürdü- ve şimdi konsept şu şekilde - sunuculara program yüklemek bireysel olarak özelleştirilmiş işletim sistemleriyle birlikte- yani, kapların içinde. 1 kapsayıcı = 1 işletim sistemi ayarı = içeride 1 program.

Diğer bir deyişle:

  • Hata ayıklama için Docker kapsayıcısının kullanılması gerekiyor.
  • Sunucuda aynı Docker kapsayıcısı kullanılmalıdır.

Bu, ayarlarla uğraşmamanızı sağlar. "sunucu için" geliştiricinin makinesinde yerel olarak. Bu, geliştiricinin makinesinde tamamen geliştirmenizi sağlar Aynı anda farklı programlar Gerektiren uyumsuz işletim sistemi ayarları... Bu, sunucudaki programın geliştiricinin makinesindekiyle aynı şekilde davranacağına dair çok daha fazla garanti vermenizi sağlar. Bu, Linux altında uygun "şeffaf" testlerle Windows / MacOSX için geliştirmeye olanak tanır.

Docker, oluşturma/özelleştirme için geçerlidir Linux için sadece sunucu yazılımı(FreeBSD altında deneysel). Akıllı telefonlar için değil. Ve masaüstleri varsa, o zaman yalnızca GUI'si olmayan yazılımlar.

Docker'ın izin verdiği kadarıyla Geliştiricilerin ve yöneticilerin işini basitleştirin ve sonucun kalitesini bir çırpıda iyileştirin- şimdi Docker'da patlama yapıyor. Docker ile oluşturulmuş uygulamaların dağıtımını yönetmek için devasa bir araç dağı icat edildi. Daha önce, 1.000 sunucuda 10.000 program çalıştırmak için, yazan en az 3 yüksek nitelikli geliştiriciye ihtiyacınız vardı. nasıl olduğuna dair bir sürü açıklama Bunu Kukla, Tuz, Şef, Ansible'da yapmak için ve o zaman bile hiçbir garanti yoktu, hepsi aylarca test edildi. Artık Docker ile, tek bir kalifiye geliştirici bile on binlerce sunucuda milyonlarca programı çalıştırabilir. Tüm bunların normal şekilde başlayacağına dair çok daha büyük bir garantiyle.

Geliştiricinin kapsayıcıları Docker'da hazırladığı ve ardından bunları yöneticiye aktardığı konusunda yanlış bir izlenim olabilir.
Doğru metodoloji hala farklıdır:

Geliştirici, tüm çıktılarını CI sistemine gönderir (genellikle git aracılığıyla)
Her yeni taahhüt için CI, test için bir görüntü oluşturmak için Docker'ı kullanır.
Testler başarılı olursa, dağıtım için üretime aynı Docker görüntüsü gönderilir.
Veya, biraz farklı olarak, üretimde kaynaklara ihtiyaç duyulmayan derlenmiş sistemlerde: Docker'da, ortam derleme için dağıtılır ve test için, zaten üretime gönderilen zaten derlenmiş ürünle birlikte ikinci bir görüntü dağıtılır.

Yani, vakanın doğru organizasyonu ile geliştirici görüntünün ne olacağını etkileyemez / etkilememelidir.
Ancak bir test ortamında (bir sunucuda çalıştırın, büyük ekiplerde bir geliştirici tarafından erişilemez) ve üretimde, sadece kullanılır aynı görüntü.

Ana fikir, test ettiğimiz şeyin tam olarak üretim sunucusunda çalıştırdığımız şey olmasıdır. Aynı dosyalar dahil bire bir (aynı değil, yani aynı).

Docker, uygulamaları çalıştırmak için ihtiyacınız olan her şeyi sağlamak için kapsayıcıları kullanan popüler bir araçtır. Docker kapsayıcılarını kullanarak, uygulamanızın hangi makinede çalıştırırsanız çalıştırın aynı şekilde çalışacağından emin olabilirsiniz.

Bu öğreticide, kapsayıcıları ve Docker görüntülerini bağlamayı ve kapsayıcıların nasıl kurulacağını, başlatılacağını, durdurulacağını ve kaldırılacağını öğreneceksiniz.

genel bakış

liman işçisi görüntüsü kaplar oluşturmak için kullanılan bir tür şablon olarak düşünülebilir. Görüntüler genellikle, çeşitli değişikliklerin ve bunlara karşılık gelen başlatma parametrelerinin daha sonra üstteki katmanlara eklendiği kök dosya sistemiyle başlar. Tipik Linux dağıtımlarından farklı olarak, bir Docker görüntüsü genellikle yalnızca uygulamayı çalıştırmak için gereken parçaları içerir. Görüntülerin durumları yoktur ve değişmezler. Docker kapsayıcılarının başlangıç ​​noktası, temeli olduklarını söylemek daha doğru olur.

Docker run komutunu girdiğiniz anda görüntüler canlanır - görüntünün üzerine yeni bir okuma/yazma katmanı ekleyerek hemen bir kapsayıcı oluşturur. Bu salt okunur düzeylerin birleşimi (üste bir okuma-yazma düzeyi eklenir), birleştirilmiş dosya sistemlerini basamaklandıran bir dosya sistemi olan UnionFS olarak da bilinir. Çalışan bir kapsayıcıdaki mevcut bir dosyada her değişiklik yapıldığında, dosya salt okunur alandan değişikliklerin uygulandığı okuma-yazma düzeyine kopyalanır. Ve şimdi orijinal dosya okuma / yazma sürümü tarafından gizleniyor, ancak silinmiyor. Okuma/yazma düzeyindeki bu tür değişiklikler yalnızca bu ayrı kapsayıcıda bulunur. Kapsayıcı silindiğinde, tüm değişiklikler de (kaydedilmemişlerse) kaybolur.

Konteynerlerle çalışma

Docker run komutunu her kullandığınızda, belirttiğiniz görüntüden yeni bir kapsayıcı oluşturulur. Daha spesifik örnekler aşağıda tartışılacaktır.

Adım 1: iki kapsayıcı oluşturma

Aşağıdaki docker run komutu, Ubuntu görüntüsünü temel olarak kullanacak yeni bir kapsayıcı oluşturur. -t anahtarı bir terminal sağlar ve -i anahtarı onunla etkileşim kurma yeteneği sağlar. Kapsayıcının içine girmek için standart bash komutunu kullanabilirsiniz. Yani, şunları girebilirsiniz:

$ liman işçisi çalıştırma -ti ubuntu

$ docker run -i -t ubuntu: 14.04 / bin / bash

(ikinci durumda, konteynerin içinde / bin / bash komutunu çalıştırırsınız ve kendinizi otomatik olarak konteynerin içinde bulursunuz)

Komut istemi, süper kullanıcı olarak kapsayıcının içinde olduğunuzu onaylayacaktır. @ işaretinden sonra, içinde bulunduğunuz konteynerin kimliğini göreceksiniz:

[e-posta korumalı]:/#

Şimdi, / tmp dizinini düzenlemek için echo komutunu kullanın ve ardından değişikliklerin cat komutunu kullanarak kaydedildiğini kontrol edin:

Yankı "Örnek1"> /tmp/Örnek1.txt cat /tmp/Örnek1.txt

Ekranda şunları görmelisiniz:

Şimdi konteynerden çıkın:

Verilen komut yürütüldüğünde ve komut satırından çıktığınızda, Docker kapsayıcısı çalışmayı durdurdu. docker ps komutunu kullanırsanız bunu görebilirsiniz:

Çalışan konteynerler arasında yukarıda kullanılanı görmeyeceksiniz:

KONTEYNER KİMLİK GÖRÜNTÜ KOMUT OLUŞTURULDU DURUM PORT İSİMLERİ

Bununla birlikte, hem çalışan hem de durdurulan tüm kapsayıcıları görmek için -a anahtarını ekleyebilirsiniz ve ardından daha önce üzerinde çalıştığınız kapsayıcı gösterilecektir:

$ docker ps -a CONTAINER ID GÖRÜNTÜ KOMUTU OLUŞTURULDU DURUM PORTLARI ADLARI 11cc47339ee1 ubuntu "/ bin / bash" 9 dakika önce Çıkıldı (127) 10 saniye önce small_sinoussi

Bir kapsayıcı oluşturulduğunda, bir kimliği ve otomatik olarak oluşturulan bir adı vardır. Bu durumda, 11cc47339ee1 kapsayıcı kimliğidir ve small_sinoussi oluşturulan addır. ps -a komutu, bu verileri ve kabın oluşturulduğu görüntüyü (bu durumda ubuntu), kapsayıcının ne zaman oluşturulduğunu (9 dakika önce) ve içinde hangi komutun çalıştırıldığını gösterir ("/ bin / bash"). Konteynerin durumunu da görebilirsiniz (10 saniye önce bıraktınız) Kap hala çalışıyorsa, "Yukarı" durumunu ve halihazırda çalışmakta olduğu zamanı görürsünüz.

Şimdi kapsayıcıyı oluşturmak için komutu tekrar girebilirsiniz:

$ liman işçisi çalıştırma -ti ubuntu

Komutun geçen seferkiyle aynı görünmesine rağmen, tamamen yeni bir kapsayıcı oluşturacaktır - farklı bir kimlik numarasına sahip olacaktır ve daha önce düzenlediğiniz Örnek1 dosyasının içeriğine bakmaya çalışırsanız, bul onu.

[e-posta korumalı]: / # kedi / tmp / Örnek1

Çıktı şöyle olacaktır:

Cat: / tmp / Örnek1: Böyle bir dosya veya dizin yok

Size veriler kaybolmuş gibi görünebilir, ancak elbette durum böyle değil. Her iki kapsayıcının da (doğru dosyaya sahip ilk kapsayıcı dahil) sistemde var olduğundan emin olmak için ikinci kapsayıcıdan çıkın.

[e-posta korumalı]: / # çıkış $ docker ps -a

Çıktı şöyle olacaktır:

KONTEYNER KIMLIĞI GÖRÜNTÜ KOMUTU OLUŞTURULDU DURUM PORT ADLARI 6e4341887b69 ubuntu "/ bin / bash" Yaklaşık bir dakika önce Çıkıldı (1) 6 saniye önce kickass_borg 11cc47339ee1 ubuntu "/ bin / bash" 15 dakika önce Çıkıldı (127) 6 dakika önce small_sinoussi

Adım 2: ilk kapsayıcıyı yeniden başlatma

Önceden oluşturulmuş bir kapsayıcıyı yeniden başlatmak için iki -ai anahtarıyla start komutunu kullanmanız gerekir. Son olarak çalışmak istediğiniz konteynerin kimlik numarasını veya adını yazmanız gerekmektedir. Sonuç olarak, komutunuz şöyle görünecektir:

Docker başlangıç ​​-ai 11cc47339ee1

Artık kapsayıcının içindeki bash kabuğuna geri döndünüz ve makalenin başında oluşturduğunuz dosyanın hala burada olduğunu doğrulayabilirsiniz:

Cat /tmp/Örnek1.txt

Ekranda göreceksiniz:

Artık kapsayıcıdan çıkabilirsiniz:

Bu şekilde, kapsayıcıyı durdurup yeniden başlatsanız bile kapsayıcı içindeki tüm değişiklikler kaydedilir. Veriler yalnızca kapsayıcının kendisi silindiğinde silinir. Ayrıca yukarıdaki örnek, değişikliklerin tek bir kapsayıcıyı etkilediğini (ve tüm kapsayıcıları aynı anda etkilemediğini) gösterir.

3. Adım: Her iki kapsayıcıyı da çıkarın

Son adım, bu öğreticiyi izleyerek oluşturduğunuz iki kapsayıcıyı silmektir. Bunu yapmak için docker rm komutunu kullanmanız gerekir. Ancak, yalnızca durdurulmuş kapsayıcıları etkiler. Komuttan sonra, bir veya daha fazla konteynerin kimlik numarasını veya adını belirtmelisiniz. Örneğin, daha önce oluşturulmuş kapsayıcıları silmek için şu komutu girmelisiniz:

Docker rm 6e4341887b69 small_sinoussi

Ekran şunları gösterecektir:

6e4341887b69 küçük_sinoussi

Her iki kap da şimdi kaldırıldı.

Çözüm

Bu öğreticide, Docker'da çalışmak için temel komutları ve kapsayıcıların nasıl oluşturulacağını, durdurulacağını, yeniden başlatılacağını ve silineceğini öğrendiniz.